集中化管理平台saltstack--state(5)
statestate是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等。
state的定义
state的定义是通过sls文件进行描述的,支持YAML语法,定义规则如下:
$ID: #定义state名称,通常采用与描述对象保存一致的方法,如apache、nginx等
$state: #须管理对象的类型
- $state: states #定制对象的状态
官网示例如下:
apache:
pkg:
- installed
service:
- running
- require:
- pkg: apache
注:
require:在运行此state之前,先运行依赖的state关系检查,可配置多个state依赖对象;
watch:在检查摸个state发生变化时运行此模块。
state的使用
state的入口文件与pillar一样,文件名都是top.sls,区别在于state要求sls文件必须存放在Saltstack base定义的目录下(默认为/srv/salt)。
state描述配置 *.sls支持:
jinjia模板:
指定分发到minion端的file文件中使用jinjia,通过使用template指令指定类型来区分是模板还是普通文件资源。
如: file.managed
- name: /…… #对不同的服务,指定存放至minion端的配置文件路径
- source: salt://…… #发送给minion端的配置文件在master端的位置,salt:// 是指从salt的文件根目录开始。
- user: root #指定推送至minion端后的文件属主
- group: root #指定推送至minion端后的文件属组
- mode: 644 #指定推送至minion端后的文件权限
- template:jinja #指定文件中的jinja参数根据客户端条件自动生成相应的值。
……
grains及pillar引用
变量使用Grains:{{ grains['fqdn_ip4'] }}
变量使用执行模块:{{ salt['network.hw_addr']('eth0') }}
变量使用Pillar:{{ pillar['apache']['PORT'] }}
在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文件,两者效果是一样的。
即【/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
salt '*' pillar.data 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: #确保Apache服务只有在成功安装软件包后才会启动
- pkg: {{ pillar['pkgs']['apache'] }}
执行state
默认匹配所有的state.sls模块,并推送。
salt '*' state.highstate 结果:
————————————————————————————————————————————
例2:
top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件。
首先在salt配置文件 /etc/salt/master 中定义
nodegroups:
my_app: 'L@主机名,主机名……'
注:L@表示后面的主机id格式为列表
G@表示以grain格式描述
S@表示以IP子网或地址格式描述
top.sls内容如下:
base:
my_app:
- match: nodegroup
- nginx
'os:Redhat':
- match: grain
- nginx
编写完top.sls后,编写state.sls文件;
即【/srv/salt/nginx.sls】或【/srv/salt/nginx/init.sls】
nginx:
pkg:
- installed
service.running:
- enable: True
- reload: True
- require:
- file: /etc/init.d/nginx
- watch:
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/fastcgi.conf
- pkg: nginx
/etc/nginx/nginx.conf:
file.managed:
- source: salt://files/nginx/nginx.conf
- user: root
- mode: 644
- template: jinja
- require:
- pkg: nginx
/etc/nginx/fastcgi.conf:
file.managed:
- source: salt://files/nginx/fastcgi.conf
- user: root
- mode: 644
- require:
- pkg: nginx
在这个例子中, /etc/nginx/里的文件并不会被placed(managed),直到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:在运行此state之前,先运行依赖的state关系检查,可配置多个state依赖对象;- 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
参考资料:Python自动化运维
页:
[1]