state 介绍
state 是 Saltstack 最核心的功能,通过预先定制好的 sls(salt state file)文件对被控主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等,更多状态对象见 http://docs.saltstack.com/ref/states/all/index.html 。
state的定义
state 的定义是通过 sls 文件进行描述的,支持 YAML 语法,定义的规则如下:
$ID:
$State:
- $state: states
其中:
-
$ID,定义 state 的名称,通常采用与描述的对象保持一致的方法,如apache、nginx 等;
-
$State,须管理对象的类型,详见 http://docs.saltstack.com/ref/states/all/index.html;
-
$state:states,定制对象的状态。
官网提供的示例如下:
apache:
pkg:
- installed
service:
- running
- require:
- pkg: apache
上述代码检查 apache 软件包是否已安装状态,如果未安装,将通过 yum 或 apt 进行安装;检查服务 apache 进程是否处于运行状态。下面详细进行说明:
第 1 行用于定义 state 的名称,此示例为 apache,当然也可以取其他相关的名称。
第 2 行和第 4 行表示 state 声明开始,使用了 pkg 和 service 这两个状态对象。pkg 使用系统本地的软件包管理器(yum 或 apt)管理将要安装的软件,service 管理系统守护进程。
第 3 行和第 5 行是要执行的方法。这些方法定义了 apache 软件包和服务目标状态,此示例要求软件包应当处于已安装状态,服务必须运行,如未安装将会被安装并启动。
第 6 行是关键字 require,它确保了 apache 服务只有在成功安装软件包后才会启动。
|
state的使用
state 的入口文件与 pillar 一样,文件名称都是 top.sls,但 state 要求 sls 文件必须存放在 saltstack base 定义的目录下,默认为 /srv/salt。state 描述配置 .sls 支持 jinjia 模板、grains 及 pillar 引用等,在 state 的逻辑层次定义完成后,再通过 salt '*'state.highstate 执行生效。下面扩展 10.5.1 节定义的范例,结合 grains 与 pillar,实现一个根据不同操作系统类型部署 apache 环境的任务。
-
定义pillar
pillar/top.slsbase: '*': - apache在 top.sls 中引用二级配置有两种方式:一种是直接引用,如本示例中直接引用apache.sls;另一种是创建 apache 目录,再引用目录中的 init.sls 文件,两者效果是一样的。为了规范起见,笔者建议采用二级配置形式,同理, state 的 top.sls 也采用如此方式。
#mkidr /srv/pillar/apache #创建apache目录pillar/apache/init.slspkgs: {% if grains['os_family'] == 'Debian' %} apache: apache2 {% elif grains['os_family'] == 'RedHat' %} apache: httpd {% elif grains['os'] == 'Arch' %} apache: apache {% endif %}测试 pillar 数据,执行 salt '*' pillar.data pkgs,结果返回以下信息,说明配置已生效。
SN2013-08-021: ---------- pkgs: ---------- apache: httpd -
定义state
salt/top.slsbase: '*': - apachesalt/apache/init.slsapache: pkg: - installed - name: {{ pillar['pkgs']['apache'] }} service.running: - name: {{ pillar['pkgs']['apache'] }} - require: - pkg: {{ pillar['pkgs']['apache'] }}在配置中,
{{ pillar['pkgs']['apache'] }}将引用匹配到操作系统发行版对应的 pillar 数据,笔者的环境为 CentOS,故将匹配为 httpd,检查目标主机是否已经安装,没有则进行安装(yum -y install httpd),同时检查 apache 服务是否已经启动,没有则启动(/etc/init.d/httpd start)。 -
执行state
执行 state 及返回结果信息见图10-15。
Figure 1. 图10-15 执行state的结果信息从图10-15中可以看出,结果返回两种对象类型结果,分别为 pkg 与 service,执行的结果是自动部署 apache 2.2.15 环境并启动服务。