wedsddsa 发表于 2017-3-1 16:41:14

集中化管理平台saltstack--state(5)

state

state是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等。
state的定义

state的定义是通过sls文件进行描述的,支持YAML语法,定义规则如下:

$ID: #定义state名称,通常采用与描述对象保存一致的方法,如apache、nginx等
$state: #须管理对象的类型
    - $state: states #定制对象的状态

官网示例如下:

apache: #state名称:apache
pkg: #管理对象类型:pkg,进行软件安装(yum、apt)
    - installed #pkg要执行的方法:install,如未安装就进行安装
service: #管理对象类型:service,管理系统守护进程
    - running #service要执行的方法:running,如未运行就进行启动
    - require: #关键字require,确保apache服务只有在成功安装软件包后才会启动
      - pkg: 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执行生效。

SLS(代表SaLt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理

首先,在master上面定义salt的主目录,vim /etc/salt/master:
例1:

结合grains与pillar,实现一个根据不同操作系统类型部署apache环境的任务
定义pillar

【/srv/pillar/top.sls】

base:
'*':
      - apache

在top.sls中引用二级配置有两种方式,一种是直接引用,如本例中直接引用apache.sls;另一种是创建apache目录,再引用目录中的init.sls文件,两者效果是一样的。

编写完top.sls后,编写pillar.sls文件;

即【/srv/pillar/apache.sls】或【/srv/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 %}

测试:

salt '*' saltutil.refresh_pillar #刷新pillar
salt '*' pillar.data pkgs #获取pkgs信息

测试看输出的Apache是否正确。


定义state

【/srv/salt/top.sls】

base:
'*':
    - apache



编写完top.sls后,编写state.sls文件;

【/srv/salt/apache.sls】或【/srv/salt/apache/init.sls】

apache:
pkg:
      - installed
      - name: {{ pillar['pkgs']['apache'] }}   #pillar['pkgs']['apache']引用的是pillar定义的数据
service.running:
      - name: {{ pillar['pkgs']['apache'] }}
      - require:
         - pkg: {{ pillar['pkgs']['apache'] }}

执行state

默认匹配所有的state.sls模块,并推送。

salt '*' state.highstate


结果:




————————————————————————————————————————————

例2:

top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件。

top.sls内容如下:

base:
   my_app:             #通过分组名去进行匹配 必须要定义match:nodegroup
      - match: nodegroup
      - nginx

'os:Redhat':      #通过grains模块去匹配,必须要定义match:grain
      - match: grain
      - nginx

编写完top.sls后,编写state.sls文件;

即【/srv/pillar/nginx.sls】或【/srv/pillar/nginx/init.sls】

nginx:
pkg:               #定义使用(pkg state module)
    - installed      #安装nginx(yum安装)
service.running:   #保持服务是启动状态
    - enable: True
    - reload: True
    - require:
      - file: /etc/init.d/nginx
    - watch:               #检测下面两个配置文件,有变动,立马执行上述/etc/init.d/nginx 命令reload操作
      - file: /etc/nginx/nginx.conf
      - file: /etc/nginx/fastcgi.conf
      - pkg: nginx
/etc/nginx/nginx.conf:       #绝对路径
file.managed:
    - source: salt://files/nginx/nginx.conf#nginx.conf配置文件在salt上面的位置
    - user: root
    - mode: 644
    - template: jinja   #salt使用jinja模块
    - require:
      - pkg: nginx

/etc/nginx/fastcgi.conf:
file.managed:
    - source: salt://files/nginx/fastcgi.conf
    - user: root
    - mode: 644
    - require:
      - pkg: nginx

在salt的主目录下的files/nginx/fastcgi.conf和files/nginx/nginx.conf文件,里面内容就是Nginx的配置文件的内容。

测试:

把Nginx网minion上面推送,并测试安装:

salt '*' state.sls nginx test=True
……输出信息略……


————————————————————————————————————————————


state的逻辑关系列表:

    include: 包含某个文件

include:
- nginx
- php

    match: 配模某个模块

- require:
- pkg: nginx

    watch: 在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作

- watch:
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/fastcgi.conf
- pkg: nginx

    order: 优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内安装多个服务,或者其他依赖关系,可以使用

nginx:
pkg.installed:
    - order:1
页: [1]
查看完整版本: 集中化管理平台saltstack--state(5)