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

其中:

官网提供的示例如下:

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 服务只有在成功安装软件包后才会启动。

  • require:在运行此 state 前,先运行依赖的 state 关系检查,可配置多个state 依赖对象;

  • watch:在检查某个 state 发生变化时运行此模块。

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 环境的任务。

  1. 定义pillar

    pillar/top.sls
    base:
          '*':
            - apache

    在 top.sls 中引用二级配置有两种方式:一种是直接引用,如本示例中直接引用apache.sls;另一种是创建 apache 目录,再引用目录中的 init.sls 文件,两者效果是一样的。为了规范起见,笔者建议采用二级配置形式,同理, state 的 top.sls 也采用如此方式。

    #mkidr /srv/pillar/apache    #创建apache目录
    pillar/apache/init.sls
    pkgs:
    {% 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
  2. 定义state

    salt/top.sls
    base:
      '*':
        - apache
    salt/apache/init.sls
    apache:
      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)。

  3. 执行state

    执行 state 及返回结果信息见图10-15。

    image 2023 12 09 11 36 13 431
    Figure 1. 图10-15 执行state的结果信息

    从图10-15中可以看出,结果返回两种对象类型结果,分别为 pkg 与 service,执行的结果是自动部署 apache 2.2.15 环境并启动服务。