状态文件
Salt的状态文件使用的YAML语法,YAML语法比较简单,下面是几个主要的点
YAML语法小贴士
- 使用单引号''
- 注意层级缩进,两个空格为单位
- key: value,中间有个空格
- 短横线 - 代表为列表中的元素
状态文件在哪里写?
状态文件的路径定义在/etc/salt/master里
Salt可以针对不同的环境单独设置状态文件路径,默认Base配置好了一个路径,不过是注释掉的,所以取消注释就可以了,如果文件系统没有这个路径,咱手动创建下
# vim /etc/salt/master
599 file_roots:
600 base:
601 - /srv/salt/
重启salt-master载入新配置
# /etc/init.d/salt-master restart
状态文件怎么写?
这里贴出一个简单的小例子,initial和web目录是为了区分状态文件的类型的,这样方便我们分类管理
root@server:/srv/salt# ls
initial top.sls web
root@server:/srv/salt# cat initial/basic.sls
basic-install: # 任务的名字
pkg.installed: # 调用pkg模块的installed方法
- names: # names是个列表,里面的元素是要安装的包的名字
- lrzsz # 上传下载文件的包
- htop # 查看系统资源的包
如何执行写好的状态文件?
通过执行state.sls执行指定的sls文件,例如:root@server:/srv/salt# salt 'server' state.sls initial.basic
,initial是包,basic是模块,所以连起来就是,使用state模块的sls方法,执行initial包里的basic模块。
小例子
下面是执行结果:
root@server:/srv/salt# salt 'server' state.sls initial.basic
server:
----------
ID: basic-install
Function: pkg.installed
Name: lrzsz
Result: True
Comment: Package lrzsz is already installed
Started: 10:44:02.410871
Duration: 639.356 ms
Changes:
----------
ID: basic-install
Function: pkg.installed
Name: htop
Result: True
Comment: Package htop is already installed
Started: 10:44:03.050360
Duration: 4.807 ms
Changes:
Summary for server
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 644.163 ms
执行结果里包含了很多东西,例如ID(我理解为任务标识),用到了什么执行函数,执行多长时间,是否正常完成执行等等,这些东西估计后续做运维平台开发时都会用到。
状态文件到底如何执行的?
我们不能光知其然还要知其所以然,到底咱在敲下这个执行状态的命令后,到底发生了什么,简单思考下
- 首先salt确定了执行目标的范围,嗯,就一个server
- 接着salt调用了state模块中sls方法
- 由于状态文件是在master端编写的,minion端并没有,所以master要把状态模块发送给了minion端,存放路径在
root@server:/srv/salt# ls /var/cache/salt/minion/files/base/initial/ basic.sls
- minion开始执行状态模块,返回执行结果
TOP file是什么?
先不说topfile是什么,先说一个需求,假如我们写了很多模块,例如初始化操作系统的,安装基础包的,安装web服务的,安装db服务等等,但是假如咱用state.sls就需要手动挨个执行状态文件,几个还好,假如是多个那就很忧伤了,如果有一个地方能够定义服务器和状态文件的对应关系就好了,TOP file就是干这个的
topfile是个名词,一般都用top.sls来命名,使用topfile功能需要修改配置文件,其实取消下注释就行了
root@server:/srv/salt# vim /etc/salt/master
517 state_top: top.sls
topfile 在那写?
这个需要说明一点就是,top.sls需要定义在base环境所定义的路径下,结合上面base环境的定义,我们应该吧top.sls,写在/srv/salt/top.sls这里
topfile 怎么写?
这是个小例子,这里使用到了刚才写的状态模块
root@server:/srv/salt# cat top.sls
base:
'server':
- initial.basic
- base代表的是环境
- server是minion_id,也就是服务器标识
- -关联的状态模块,关联多个的话,就新起一行同样的格式
topfile 如何执行?
使用state.highstate模块方法执行
root@server:/srv/salt# salt 'server' state.highstate
topfile 执行应该注意什么?
- 使用
salt '*' state.show_top
,确认minion所要执行的状态文件 - 使用
salt 'server' state.highstate test=True
先测试,salt会返回它要执行什么,咱最好确认下,在执行salt 'server' state.highstate
- 尽量不要使用 *
- 既然用了,就用到底,例如实际集群节点数和状态文件不一致,当执行topfile导致部分节点失效,从而宕机,这个案例来自于知名外卖网站