SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。



组成形式

配置文件从top.sls为入口,这里面定义所有文件信息。

基础环境搭建

服务端安装脚本

1
2
curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P -M

客户端安装脚本

1
2
curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P

 指定-P 代表着 master 安装

基础环境配置

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vi /etc/salt/master

//配置主服务器地址
interface: 192.168.1.192

//以哪个用户运行
user: root

//指定salt配置路径
file_roots:
base:
- /root/saltstack/salt/base
prod:
- /root/saltstack/salt/prod

//环境配置文件
pillar_roots:
base:
- /root/saltstack/pillar/base

客户端配置

1
2
3
4
5
6
7
vi /etc/salt/minion

//指定主服务器ip
master: 192.168.1.192

//指定机器ID 不要重名!
id: salt_slave_01

此刻就配置完毕,进入调试连接部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//打开客户端的debug模式(注意,必须关闭salt-minion服务,否则会提示端口占用,debug模式单独跑的!调试完毕以后在启动salt-minion服务)

root@salt_slave_01:~# salt-minion -l debug

//进入master,查看授权列表
[root@localhost ~]# salt-key -L
Accepted Keys: //同意的key
Denied Keys: //拒绝的key
Unaccepted Keys: //未接受的key
salt_slave_01
salt_slave_02
Rejected Keys: //被拒绝的key

//可以看到已经有两个minion请求授权了
//授权主机
[root@localhost ~]# salt-key -a salt_slave1

//全部授权
[root@localhost ~]# salt-key -A

//授权结束以后就完成了master和minion的连接动作

//测试和子节点的连通性
[root@localhost ~]# salt '*' test.ping
salt_slave_01:
True
salt_slave_02:
True

//安装配置文件中的服务,并同步所有配置文件数据
salt '*' sate.highstate
``
至此完成全部salt软件安装服务

# 命令附录

```shell
***********模块***********
查看模块列表module
salt 'minion' sys.list_modules
查看指定module的function用法
salt 'minion' sys.list_functions file
查看指定模块的详细用法
salt 'minion' sys.doc cmd

***********模块使用说明***********
查看配置管理state模块列表
salt 'minion' sys.list_state_modules
查看配置管理sate列表指定模块所有方法列表
salt 'minion' sys.list_state_functions svn
查看配置管理state列表指定模块详细用法
salt 'minion' sys.state_doc file
查看配置管理state列表指定模块的方法分支
salt 'minion' sys.state_doc file.managed

***********pillar变量***********
查看主机对应的所有pillar变量值
salt '*' pillar.data
salt '*' pillar.items
查看主机对应的多个pillar变量值
salt '*' pillar.item roles appname
修改pillar值后需要刷新pillar数据
salt '*' saltutil.refresh_pillar
查看pillar模块详细用法,其他类似
salt 'minion' sys.doc pillar
查看pillar的相关方法
salt 'minion' sys.list_functions pillar
"""
shuke:
- pillar.data
- pillar.ext
- pillar.get
- pillar.item
- pillar.items
- pillar.raw
"""

***********grains变量***********
查看模块用法
salt 'minion' sys.list_functions grains
查看item项
salt 'minion' grains.ls
查看所有iteams
salt 'minion' grains.items
获得某个item值
salt 'minion' grains.get os
同步_grains目录下的py脚本至minion
salt 'minion' saltutil.sync_all
如果py模块有修改,修改后进行重载
salt 'minion' sys.reload_modules

***********minions在线状态***********
查看所有minion状态
salt-run manage.status
查看所有minion在线状态
salt-run manage.up
查看所有minion不在线状态
salt-run manage.down

***********key管理***********
salt-key 密钥管理,通常在master端执行
salt-key [options]
salt-key -L ##查看所有minion-key
salt-key -a <key-name> ##接受某个minion-key
salt-key -d <key-name> ##删除某个minion-key
salt-key -A ##接受所有的minion-key
salt-key -D ##删除所有的minion-key

***********salt-call相关***********
salt-call 该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] <function> [arguments]
salt-call test.ping ##自己执行test.ping命令
salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数

***********文件分发***********
salt-cp 分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html
salt 'S1_0_001_Room' cp.get_dir salt://package /tmp -v 同步目录
salt 'S1_0_001_Room' cp.get_file salt://package/minions.tar.gz /tmp/minions.tar.gz gzip=5 同步文件

**********其他***********
salt-run jobs.active #查看所有minion当前正在运行的jobs
salt '*' saltutil.running # 查看正在运行的任务,找到jid
salt '*' saltutil.kill_job jid # 根据jid杀掉任务
salt '*' saltutil.clear_cache # 清除minion缓存

执行单个命令
salt 'minion' cmd.run 'ps -ef | grep mongod'

测试单个sls模块
salt 'minion' state.sls nginx test=True

执行前进行测试
salt 'minion' state.highstate test=True

在所有minion上执行状态:
salt 'minion' sate.highstate

获取执行jib任务的md5值
salt 'minion' hashutil.md5_digest 20170202150211366486

low数据可以使用state.show_lowstate方法查看
salt 'minion' state.show_lowstate --out yaml

High State数据可以使用state.show_hoghstate方法查看
salt 'minion' state.show_highstate --out yaml

#查看highstate
salt 'minion' state.show_highstate
#查看lowdata
salt 'minion' state.show_lowstate

#执行所有top.sls
salt '*' state.apply

#执行指定环境下top.sls
salt '*' state.apply saltenv=dev

注:
name:要执行的命令,记住该命令将会在salt-minion的路径和权限下执行
onlyif:用于检查的命令,仅当``onlyif``选项指向的命令返回true时才执行name定义的命令
unless:用于检查的命令,仅当``unless``选项指向的命令返回false时才执行name指向的命令

查看wyd用户下进程
salt -N 'Z1_S2' cmd.run 'su -c "ps -u wyd | grep -v top | grep -v bash | grep -v sshd | grep -v grep | grep -v ps | grep -v CMD " wyd'

state中(钩子函数)
requisiterequisite:require/watch/onchanges/onfail/use/prereq/require_in(反转)

========Targeting Minion=======
#Glob(默认)
salt '*' test.ping
salt \* test.ping

#PCRE 正则表达式
salt -E '^[m|M]in.[e|o|u]n$' test.ping = salt -E '^[mM]in.[eou]n$' test.ping

#list
salt -L web1,web2,db1 test.ping

#Subnet
salt -S 192.168.1.100 test.ping
salt -S 192.168.0.0/16 test.ping

#Grain
salt -G 'os:ubuntu' test.ping
salt -G 'os_family:Debian' test.ping
salt -G 'ip_interfaces:eth0:192.168.1.100' test.ping
salt -G 'ipv6:::1' test.ping
salt --grain-pcre 'os:red(hat|flag)' test.ping

#Pillar
salt -I 'my_var:my_val' test.ping

#混合(Compound)
salt -C 'G@os:Ubuntu,I@role:web,S@192.168.1.100/24' test.ping
salt -C 'min* or *ion' test.ping
salt -C 'web* or *qa,G@os:Arch' test.ping

#Nodegroup
salt -N webdev test.ping

添加计划任务
salt 'S1_*_Center' cron.set_job root '0' '5' '*' '*' '*' '/usr/sbin/logrotate -vf /etc/logrotate.d/acl >/tmp/cutacl_log 2>&1' identifier=cutacl

删除计划任务
salt -C 'E@S1_(10001|10002|10003)_*' cron.rm_job wyd 'cd /data/wyd/game_server_1.2.0/log;find . -type f -mtime +15 -name "*.log*" -exec rm -rf {} \; 2>&1' identifier='clear log'