关于salt state
核心是写sls(SaLt State file)文件,sls文件默认格式是YAML格式(以后会支持XML),并默认使用jinja模板,YAML与XML类似,是一种简单的适合用来传输数据的格式,而jinja是根据django的模板语言发展而来的语言,简单并强大,支持for if 等循环判断。salt state主要用来描述系统,软性,服务,配置文件应该出于的状态,常常被称为配置管理!
通常state,pillar会用sls文件来编写。state文件默认是放在/srv/salt中,实际工作中为了更便捷管理,前面我们设置的目录为/srv/salt/state,后期再根据不同的项目或用途,再在state下新建子目录管理。
YAML语法
1、空格和TAB
yaml两个空格为缩进,不能用tab
2、冒号 :和减号 -
: 和- 之间要有一个空格
3、数字解析
mode: 0644 会解析成为mode: 644 最好使用mode: (0644)
JinJa模板
Jinja 基于Python模板引擎开发,saltstack默认使用yaml_jinja渲染器,渲染流程时先jinja在yaml解析.所以在开始解析yaml的时候可以使用jinja”偷个腥”,用法如下:
1、jinja中使用grains{{ grains['os'] }}
2、jinja中使用Pillar{{ pillar['apache']['PORT'] }}
3、jinja的逻辑关系
{% if grains['os'] == 'RedHat' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
sls文件执行的两种方式
建议:srv/salt/state下新建各用途的目录,再在目录中再新建sls文件(默认为init.sls),不要把所有的sls文件都放在state下,显的很乱且不好管理!
NO1:
在/srv/salt/state下新建top.sls,top.sls中指定要执行的sls文件,state.highstate推送匹配的所有sls文件
例:
[root@test11 state]# pwd
/srv/salt/state
[root@test11 state]# salt '*' state.highstate #执行top.sls下匹配的所有sls
[root@test11 state]# vim top.sls
base:
'*': #要推送到的客户端,*指所有minion端,也可以指定单个
- hosts #/srv/salt/state/hosts下的init.sls
[root@Master salt]# vim init.sls
/tmp/hosts: #推送到的目的地下的文件名
file.managed:
- source: salt://hosts/templates/hosts #推送的文件存放位置,在/srv/salt/etc下
- user: root
- group: root
- mode: 600
NO2:
指定推送单个sls文件:salt '*' state.sls [sls文件]
例:
按照上述例子推送hosts文件:salt '*' state.sls hosts
注:大家可能注意到上面命令state.sls hosts这个目录就可以了,原因是salt用的是python写的,在py下init为默认的初始配置,所以可以略写,但如果要执行的是hosts目录下的其它sls文件,假如是a.sls文件,可参考如下执行:salt '*' state.sls hosts.a
状态之间的依赖关系
1、我依赖谁 #require
2、谁依赖我[我被谁依赖] #require_in
3、我监控谁 #watch 如果配置文件有修改,那么会重载、重启服务
4、谁监控我[我被谁监控] #watch_in 如果配置文件有修改,那么会重载、重启服务
5、我引用谁 #include
6、我扩展谁 #extend
salt schedule
schedule是salt中的crontab,结合pillar使用,就是周期性执行一些函数,以下例说明:
[root@Master pillar]# cat hosts/init.sls
schedule:
hosts: ##这个是ID,可以随意起,全文件唯一
function: state.sls ##对于master,function就是runner
seconds: 30 ##间隔秒数
minutes: 15 ##间隔分数
minutes: 2 ##间隔小时数
args:
- 'hosts'
注:上面sls文件的意思是每隔2小时15分30秒执行hosts的state.sls文件。