什么是state模块?
- 远程执行是salt的核心所在。
- 管理员可与通过执行远程执行模块,达到对minion的控制(如
cmd.run "yum install -y httpd"
),但对于minion的环境控制,即你想minion达到一个什么样的状态,用state模块更为合适。 - 你只需要描述你想salt minion达到什么状态就行了,剩下的交由state模块来完成。如下:
在minion上部署一个Apache,用state模块来定义它的状态
- 我们可以用熟悉的pkg.install来部署
salt 192.168.184.133 pkg.install "httpd"
下面看看怎么用state部署。 - state模块部署Apache:
[root@localhost salt]# vim apache.sls
install_httpd:
pkg.installed:
- name: httpd
[root@localhost salt]# salt 192.168.184.133 state.sls apache
192.168.184.133:
----------
ID: install_httpd
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 11:55:07.072487
Duration: 18276.998 ms
Changes:
----------
httpd:
----------
new:
2.2.15-60.el6.centos.5
old:
Summary for 192.168.184.133
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 18.277 s
## 再执行一次
[root@localhost salt]# salt 192.168.184.133 state.sls apache
192.168.184.133:
----------
ID: install_httpd
Function: pkg.installed
Name: httpd
Result: True
Comment: Package httpd is already installed
Started: 12:00:05.085320
Duration: 864.078 ms
Changes:
Summary for 192.168.184.133
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 864.078 ms
- 执行模块和state(状态)模块的区别:执行模块是过程式,连续调用时将执行相同的逻辑和指令;而状态模块为描述性的,它们只是执行必要的工作,在minion上根据描述文件创建指定的状态。
- 所有的state模块都会遵循这个原则,只在检测到真实状态和所需状态不同的情况下才执行功能。这可以通过判断来让minion以最小的代价进入指定的状态。
状态(sls)配置文件解析
SLS配置文件使用 YAML 语言描述。Salt默认的sls文件的renderer是 YAML renderer,它的工作是将 YAML 数据格式的结构编译成为 Python 数据结构给 Salt 使用。比较重要的三个规则如下:
- 缩进:用两个空格,不要使用 tab 键。
- 冒号:与Python的映射如下:
## YAML
my_key: my_value
## python
{'my_key': 'my_value'}
###嵌套
## YAML
my_key1: my_key2:my_value
## python
{'my_key': {
'my_key2': 'my_value'
}
}
- 短横杠:用一个短横杠加一个空格来表示列表项(Python中的列表[])
keys:
- value1
- value2
- value3
## 映射为Python:
{'key':['value1','value2','value3']
- sls配置文件的格式:<ID Declaration>必须是独一无二的有效的Python字符串。<State Module>.<Function>与远程执行命令采用相同格式。最后是函数参数,首个函数参数通常是name,然后是状态所需的其他参数。
<ID Declaration>:
<State Module>.<Function>:
- name: <name>
- <Function Arg>
- <Function Arg>
- <Function Arg>
- <Requisite Declaration>:
- <Requisite Reference>
## 下面列举写法:
<ID Declaration>:
<State Module>.<Function>:
- <Function Arg>
- <Function Arg>
- <Function Arg>
- <Names>:
- <name>
- <name>
- <name>
- <Requisite Declaration>:
- <Requisite Reference>
- <Requisite Reference>
常用的状态模块
## 获取所有的状态模块:
[root@localhost salt]# salt 192.168.184.133 sys.list_state_modules
192.168.184.133:
- acl
- alias
- alternatives
- apache
- archive
- artifactory
- at
……
## 获取状态模块中的模块的所有函数:
[root@localhost salt]# salt 192.168.184.133 sys.list_state_functions pkg
192.168.184.133:
- pkg.downloaded
- pkg.group_installed
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.mod_watch
- pkg.patch_downloaded
- pkg.patch_installed
- pkg.purged
- pkg.removed
- pkg.uptodate
file 模块
- file.managed 下发文件,确保文件存在
/etc/foo.cnf: ## 将/srv/salt/foo.cnf文件下发到minion端的/etc/foo.cnf
file.managed:
- source:
- salt://foo.cnf
- user: foo
- group: users
- mode: 644
- file.directory建立目录:
## 建立 /srv/stuff/substuf
[root@localhost salt]# vim file_directory.sls
/srv/stuff/substuf:
file.directory:
- user: root
- group: root
- mode: 755
- makedirs: True
## 执行
[root@localhost salt]# salt 192.168.184.133 state.sls file_directory
192.168.184.133:
----------
ID: /srv/stuff/substuf
Function: file.directory
Result: True
Comment: Directory /srv/stuff/substuf updated
Started: 15:04:37.131147
Duration: 20.901 ms
Changes:
----------
/srv/stuff/substuf:
New Dir
Summary for 192.168.184.133
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 20.901 ms
- 建立软链接(/etc/grub.conf -> /boot/grub/grub.conf)
[root@localhost salt]# vim file_symlink.sls
/etc/grub.conf:
file.symlink:
- target: /boot/grub/grub.conf
- file.recurse下发整个目录:
[root@localhost salt]# vim file_recurse.sls
/opt/code/flask:
file.recurese:
- source: salt://code/flask
- include_empty: True
pkg模块
- pkg.installed 软件安装:
mypkgs:
pkg.installed:
- pkgs:
- foo
- bar: '>=1.2.3-4' ##指定安装版本
- baz
mypkgs:
pkg.installed:
- sources:
- foo: salt://rpms/foo.rpm ## 指定安装的rpm来源
- bar: http://somesite.org/bar.rpm
## 指定安装最新版的软件
mypkgs:
pkg.latest:
- pkgs:
- foo
- bar
- baz
service模块
## 启动redis服务:
redis:
service.running:
- enable: True
- reload: True
- watch:
- pkg: redis ## 这里监控软件包,有更新就重启(reload)
cron模块
## 每五分钟执行一次指定任务
date > /tmp/crontest:
cron.present:
- user: root
- minute: '*/5'
user模块
- user.present 建立用户
user.present:
- fullname: luohaowen
- shell: /bin/bash
- home: /home/luohaowen
- uid: 4000
- gid: 4000
- groups:
- test
sysctl模块
- 调整内核参数:
vm.swappiness:
sysctl.present:
- value: 20
pip模块
- pip.installed安装Python模块
django:
pip.installed:
- name: django >= 1.6, <= 1.7