Saltstack之State介绍
版本
Centos 7
SaltStack 3001.1
简介
state,即状态,意思是确保主机处于state文件所描述的状态下;saltstack的基础是可以批量执行命令,那么state就类似脚本,不过由于是描述状态而不是命令的集合,所以语法更简单,但可编程性也差不少。
开始使用
state脚本必须放到saltstack的fileserver路径下,默认为/srv/salt/,可以通过/etc/salt/master中的file_roots修改。
脚本必须是.sls后缀,语法为yaml,下面新建一个example.sls:
svn: # 任务id,自定义的, 在一个sls文件中不可重复 pkg.installed: # 模块.方法 - name: subversion # name通常是任务内容, 可省略,省略时用id作为name show svn version: cmd.run:
- name: svn --version
- require: # 执行的条件
- pkg: svn # 模块.任务id, 意思是要任务svn成功才执行该任务
name省略的话,可以简化成:
subversion: pkg.installed svn --version: cmd.run: - require: - pkg: subversion
这个state会在远程主机安装svn并执行打印版本号的命令,使用下面的命令应用这个state:
shell> salt 'minion-01' state.apply example # 刚写好的state第一次用时建议加上test=True先测试下
目录结构
/srv/salt/
├── example.sls
└── test
├── init.sls
└── test.sls
假设有上面的文件结构,那么:
命令 | 执行的文件 |
salt 'minion-01' state.apply example
|
example.sls |
salt 'minion-01' state.apply test
|
test/init.sls |
salt 'minion-01' state.apply test.test
|
test/test.sls |
包含include
/srv/salt/
├── example.sls
└── tools
├── git.sls
└── svn.sls
# example.sls 内容 include: - tools.git - tools.svn
执行example就是执行了git和svn
top.sls
state.apply未指明目标时默认为top.sls,它的用法与普通sls稍有不同,示例:
/srv/salt/
├── top.sls
├── jdk.sls
└── tools
├── git.sls
└── svn.sls
# top.sls 内容 base: '*': - jdk 'minion-01': - tools.git 'minion-02': - tools.svn
命令 | 执行效果 |
salt '*' state.apply
|
jdk |
salt 'minion-01' state.apply
|
jdk、git |
salt 'minion-02' state.apply
|
jdk、svn |
总结
state适合运维统一批量的配置服务器,配合grains和pillar可以实现丰富的功能,不过使用中发现的两个问题需要避免:
1、state运行时会遍历saltstack的fileserver,所以不要将大量文件放进去;曾将svn代码检出到fileserver中,导致每次state时salt-master都跑满cpu并超时。
2、state在一台minion上同一时间只能运行一个,有并发要求的请使用远程命令模式;曾使用state配合jenkins做自动部署,导致同时构建多个程序时经常因冲突导致失败。
所以,state适合封装常见、复杂但变量不多的运维场景,而不是千奇百怪又经常变化的业务场景;saltstack不是操作系统,state更不是编程语言,针对业务项目的自动化运维,建议使用saltstack的python-api进行二次开发。
附:
可以通过命令查看帮助:
sys.list_state_modules | 列出state可用的模块 | salt 'minion-01' sys.list_state_modules |
sys.list_state_functions | 列出state指定模块的可用方法 | salt 'minion-01' sys.list_state_functions file |
sys.state_doc | 显示state指定模块的方法的用法 | salt 'minion-01' sys.list_state_functions file.managed |
官方文档(State模块):https://docs.saltstack.com/en/latest/ref/states/all/index.html
OVER