1. 主机规划
Grains文档
代码语言:javascript复制https://docs.saltstack.com/en/latest/topics/grains/index.html
注意事项
修改了master或者minion的配置文件,那么必须重启对应的服务。
2. Grains基本信息
代码语言:javascript复制Saltstack 数据系统
Grains (谷粒)
Pillar (柱子)
Grains:静态数据 当Minion启动的时候收集的Minion本地的相关信息
如:操作系统版本,内核版本,CPU,内存,硬盘,设备型号,序列号
1、信息查询 【资产管理】★★★★★
2、用于目标选择 salt -G 'os:CentOS' test.ping ★★★★★
3、配置管理中使用
刷新grains 【这样修改grains信息不用重启salt-minion 也能刷新】
不然需要重启salt-minion
salt '*' saltutil.sync_grains
开发一个Grains:
Python:写一个Python脚本,返回一个字典就可以了。
代码语言:javascript复制可以通过
salt 'salt01' saltutil.sync_grains 【推荐】
或salt 'salt01' saltutil.sync_all 【范围太广,不推荐使用】
或salt 'salt01' state.highstate 【执行高级状态时同步,不建议使用】
或salt 'salt01' saltutil.refresh_modules 【只刷新客户端,服务端向客户端分发的不刷新,比如修改了grains的py脚本时,不会推送到minion端 不建议使用】
或salt 'salt01' saltutil.refresh_grains 【只刷新客户端,服务端向客户端分发的不刷新,比如修改了grains的py脚本时,不会推送到minion端 不建议使用】
将配置同步到minion端
如果做了更改也可以使用
salt 'salt01' sys.reload_modules
3. Grains优先级信息
代码语言:javascript复制经验证优先级如下:
1、 salt系统自带信息 【优先级最低】
2、 自编写Python脚本 备注:在指定目录下存放py脚本
3、 /etc/salt/grains 备注:该文件不存在,需要自己创建
4、 /etc/salt/minion 【优先级最高】
推荐使用 自编写py脚本定义,这样自定义的grains只需要在master端维护即可,减少后期维护成本。
下文内容就是根据优先级写的。
4. Salt自带Grains 信息
4.1. grains条目项信息
代码语言:javascript复制1 [root@salt100 salt]# salt 'salt01' grains.ls # 查看salt01机器有哪些grains条目项信息
2 ………………
4.2. grains全部信息
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt01' grains.items # 查看salt01机器有哪些grains信息
2 salt01:
3 ----------
4 SSDs:
5 biosreleasedate:
6 05/19/2017
7 biosversion:
8 6.00
9 cpu_flags:
10 - fpu
11 - vme
12 - de
13 - pse
14 - tsc
15 - msr
16 - pae
17 - mce
18 - cx8
19 - apic
20 - sep
21 - mtrr
22 - pge
23 - mca
24 - cmov
25 - pat
26 - pse36
27 - clflush
28 - mmx
29 - fxsr
30 - sse
31 - sse2
32 - ss
33 - ht
34 - syscall
35 - nx
36 - pdpe1gb
37 - rdtscp
38 - lm
39 - constant_tsc
40 - arch_perfmon
41 - nopl
42 - xtopology
43 - tsc_reliable
44 - nonstop_tsc
45 - eagerfpu
46 - pni
47 - pclmulqdq
48 - ssse3
49 - fma
50 - cx16
51 - pcid
52 - sse4_1
53 - sse4_2
54 - x2apic
55 - movbe
56 - popcnt
57 - tsc_deadline_timer
58 - aes
59 - xsave
60 - avx
61 - f16c
62 - rdrand
63 - hypervisor
64 - lahf_lm
65 - abm
66 - 3dnowprefetch
67 - fsgsbase
68 - tsc_adjust
69 - bmi1
70 - avx2
71 - smep
72 - bmi2
73 - invpcid
74 - mpx
75 - rdseed
76 - adx
77 - smap
78 - clflushopt
79 - xsaveopt
80 - xsavec
81 - arat
82 cpu_model:
83 Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
84 cpuarch:
85 x86_64
86 disks:
87 - sda
88 - sr0
89 dns:
90 ----------
91 domain:
92 ip4_nameservers:
93 - 10.0.0.2
94 - 223.5.5.5
95 ip6_nameservers:
96 nameservers:
97 - 10.0.0.2
98 - 223.5.5.5
99 options:
100 search:
101 sortlist:
102 domain:
103 fqdn:
104 salt01
105 fqdn_ip4:
106 - 172.16.1.11
107 fqdn_ip6:
108 - fe80::20c:29ff:fe95:1b84
109 - fe80::20c:29ff:fe95:1b7a
110 gid:
111 0
112 gpus:
113 |_
114 ----------
115 model:
116 SVGA II Adapter
117 vendor:
118 unknown
119 groupname:
120 root
121 host:
122 salt01
123 hwaddr_interfaces:
124 ----------
125 eth0:
126 00:0c:29:95:1b:7a
127 eth1:
128 00:0c:29:95:1b:84
129 lo:
130 00:00:00:00:00:00
131 id:
132 salt01
133 init:
134 systemd
135 ip4_gw:
136 10.0.0.2
137 ip4_interfaces:
138 ----------
139 eth0:
140 - 172.16.1.11
141 eth1:
142 - 10.0.0.11
143 lo:
144 - 127.0.0.1
145 ip6_gw:
146 False
147 ip6_interfaces:
148 ----------
149 eth0:
150 - fe80::20c:29ff:fe95:1b7a
151 eth1:
152 - fe80::20c:29ff:fe95:1b84
153 lo:
154 - ::1
155 ip_gw:
156 True
157 ip_interfaces:
158 ----------
159 eth0:
160 - 172.16.1.11
161 - fe80::20c:29ff:fe95:1b7a
162 eth1:
163 - 10.0.0.11
164 - fe80::20c:29ff:fe95:1b84
165 lo:
166 - 127.0.0.1
167 - ::1
168 ipv4:
169 - 10.0.0.11
170 - 127.0.0.1
171 - 172.16.1.11
172 ipv6:
173 - ::1
174 - fe80::20c:29ff:fe95:1b7a
175 - fe80::20c:29ff:fe95:1b84
176 kernel:
177 Linux
178 kernelrelease:
179 3.10.0-862.el7.x86_64
180 kernelversion:
181 #1 SMP Fri Apr 20 16:44:24 UTC 2018
182 locale_info:
183 ----------
184 defaultencoding:
185 UTF-8
186 defaultlanguage:
187 en_US
188 detectedencoding:
189 UTF-8
190 localhost:
191 salt01
192 lsb_distrib_codename:
193 CentOS Linux 7 (Core)
194 lsb_distrib_id:
195 CentOS Linux
196 machine_id:
197 5ae5f27014ee438780bf37ae68889471
198 manufacturer:
199 VMware, Inc.
200 master:
201 salt100
202 mdadm:
203 mem_total:
204 1821
205 nodename:
206 salt01
207 num_cpus:
208 2
209 num_gpus:
210 1
211 os:
212 CentOS
213 os_family:
214 RedHat
215 osarch:
216 x86_64
217 oscodename:
218 CentOS Linux 7 (Core)
219 osfinger:
220 CentOS Linux-7
221 osfullname:
222 CentOS Linux
223 osmajorrelease:
224 7
225 osrelease:
226 7.5.1804
227 osrelease_info:
228 - 7
229 - 5
230 - 1804
231 path:
232 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
233 pid:
234 1598
235 productname:
236 VMware Virtual Platform
237 ps:
238 ps -efHww
239 pythonexecutable:
240 /usr/bin/python
241 pythonpath:
242 - /usr/bin
243 - /usr/lib64/python27.zip
244 - /usr/lib64/python2.7
245 - /usr/lib64/python2.7/plat-linux2
246 - /usr/lib64/python2.7/lib-tk
247 - /usr/lib64/python2.7/lib-old
248 - /usr/lib64/python2.7/lib-dynload
249 - /usr/lib64/python2.7/site-packages
250 - /usr/lib64/python2.7/site-packages/gtk-2.0
251 - /usr/lib/python2.7/site-packages
252 pythonversion:
253 - 2
254 - 7
255 - 5
256 - final
257 - 0
258 saltpath:
259 /usr/lib/python2.7/site-packages/salt
260 saltversion:
261 2018.3.3
262 saltversioninfo:
263 - 2018
264 - 3
265 - 3
266 - 0
267 selinux:
268 ----------
269 enabled:
270 False
271 enforced:
272 Disabled
273 serialnumber:
274 VMware-56 4d 32 86 98 5c a8 3c-50 92 82 be 30 95 1b 7a
275 server_id:
276 2097601471
277 shell:
278 /bin/sh
279 swap_total:
280 2047
281 systemd:
282 ----------
283 features:
284 PAM AUDIT SELINUX IMA -APPARMOR SMACK SYSVINIT UTMP LIBCRYPTSETUP GCRYPT GNUTLS ACL XZ LZ4 -SECCOMP BLKID ELFUTILS KMOD IDN
285 version:
286 219
287 uid:
288 0
289 username:
290 root
291 uuid:
292 86324d56-5c98-3ca8-5092-82be30951b7a
293 virtual:
294 VMware
295 zfs_feature_flags:
296 False
297 zfs_support:
298 False
299 zmqversion:
300 4.1.4
4.3. 查询grains指定信息
代码语言:javascript复制1 [root@salt100 ~]# salt 'salt01' grains.item roles # 没有该项信息,因此只显示key 不显示value
2 salt01:
3 ----------
4 roles:
5 [root@salt100 ~]# salt 'salt01' grains.item os
6 salt01:
7 ----------
8 os:
9 CentOS
5. 自写grains的py脚本
该脚本在salt master端,然后推送到minion端。
5.1. master端编写py脚本
代码语言:javascript复制 1 [root@salt100 salt]# pwd
2 /srv/salt
3 [root@salt100 salt]# mkdir _grains # salt指定的位置
4 [root@salt100 salt]# cd _grains/
5 [root@salt100 _grains]# vim my_grains.py
6 #!/usr/bin/env python
7 # -*- coding:utf-8 -*-
8
9 def grains_define():
10 # initialize a grains dictionary
11 grains = {}
12 # 填充信息
13 grains['roles'] = ["webserver01","memcache01"],
14 grains['os'] = 'redhat01'
15
16 # 返回这个字典
17 return grains
5.2. grains刷新并查看指定信息
在master端执行,并查看grains信息
代码语言:javascript复制 1 [root@salt100 ~]# salt 'salt01' saltutil.sync_grains # 会推送py脚本到minion端,并刷新grains信息
2 salt01:
3 - grains.my_grains
4 [root@salt100 ~]# salt 'salt01' grains.item roles
5 salt01:
6 ----------
7 roles:
8 |_
9 - webserver01
10 - memcache01
11 [root@salt100 ~]# salt 'salt01' grains.item os
12 salt01:
13 ----------
14 os:
15 redhat01
5.3. 在minion端查看推送过来的文件位置
代码语言:javascript复制 1 [root@salt01 minion]# pwd
2 /var/cache/salt/minion
3 [root@salt01 minion]# tree
4 .
5 ├── accumulator
6 ├── extmods
7 │ └── grains # 在这个目录下
8 │ ├── my_grains.py
9 │ └── my_grains.pyc
10 ├── files
11 │ └── base
12 │ ├── _grains
13 │ │ └── my_grains.py
14 │ ├── top.sls
15 │ └── web
16 │ └── apache.sls
17 ├── highstate.cache.p
18 ├── module_refresh
19 ├── pkg_refresh
20 ├── proc
21 └── sls.p
22
23 8 directories, 9 files
6. 在/etc/salt/grains 中定义grains
注意:
该文件默认不存在,需要自己创建。
6.1. minion端配置修改
在salt01上操作
代码语言:javascript复制1 [root@salt01 salt]# cat /etc/salt/grains
2 roles:
3 - webserver02
4 - memcache02
5 os: redhat02
6.2. grains刷新并查看指定信息
在salt100上操作
代码语言:javascript复制 1 [root@salt100 ~]# salt 'salt01' saltutil.sync_grains # 刷新grains信息
2 salt01:
3 [root@salt100 ~]# salt 'salt01' grains.item roles
4 salt01:
5 ----------
6 roles:
7 - webserver02
8 - memcache02
9 [root@salt100 ~]# salt 'salt01' grains.item os
10 salt01:
11 ----------
12 os:
13 redhat02
7. 在/etc/salt/minion 中定义grains
生产中不建议使用,因为写在了默认的配置文件中,不利于后期维护。
7.1. minion端配置修改
minion端salt01机器上配置修改
代码语言:javascript复制 1 [root@salt01 salt]# pwd
2 /etc/salt
3 [root@salt01 salt]# vim minion
4 ………………
5 # Custom static grains for this minion can be specified here and used in SLS
6 # files just like all other grains. This example sets 4 custom grains, with
7 # the 'roles' grain having two values that can be matched against.
8 grains:
9 roles:
10 - webserver03
11 - memcache03
12 os: redhat03
13 # deployment: datacenter4
14 # cabinet: 13
15 # cab_u: 14-15
7.2. grains刷新并查看指定信息
在master端刷新grains信息,并查看
代码语言:javascript复制 1 [root@salt100 ~]# salt 'salt01' saltutil.sync_grains # 刷新指定minion的grains信息
2 salt01:
3 [root@salt100 ~]# salt 'salt01' grains.item roles
4 salt01:
5 ----------
6 roles:
7 - webserver03
8 - memcache03
9 [root@salt100 ~]# salt 'salt01' grains.item os
10 salt01:
11 ----------
12 os:
13 redhat03
8. Grains使用方式
8.1. 查询grains的指定信息
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt0*' grains.item os # 通过通配符匹配salt0* minion端的操作系统信息
2 salt01:
3 ----------
4 os:
5 CentOS
6 salt03:
7 ----------
8 os:
9 CentOS
10 salt02:
11 ----------
12 os:
13 CentOS
14 [root@salt100 salt]# salt 'salt0*' grains.item ip4_interfaces:eth0 # 多级查询
15 salt03:
16 ----------
17 ip4_interfaces:eth0:
18 - 172.16.1.13
19 salt01:
20 ----------
21 ip4_interfaces:eth0:
22 - 172.16.1.11
23 salt02:
24 ----------
25 ip4_interfaces:eth0:
26 - 172.16.1.12
27 [root@salt100 salt]# salt 'salt0*' grains.item ip4_interfaces:eth0:0 # 取列表中的第一个值★★★★★
28 salt01:
29 ----------
30 ip4_interfaces:eth0:0:
31 172.16.1.11
32 salt03:
33 ----------
34 ip4_interfaces:eth0:0:
35 172.16.1.13
36 salt02:
37 ----------
38 ip4_interfaces:eth0:0:
39 172.16.1.12
8.2. 通过grains查询信息
示例1
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt01' grains.item os
2 salt01:
3 ----------
4 os:
5 CentOS
6 [root@salt100 salt]# salt -G 'os:CentOS' cmd.run 'echo "zhangliang $(date %Y)"' # 指定操作系统为CentOS的
7 salt03:
8 zhangliang 2018
9 salt02:
10 zhangliang 2018
11 salt01:
12 zhangliang 2018
13 salt100:
14 zhangliang 2018
示例2
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt01' grains.item ip_interfaces
2 salt01:
3 ----------
4 ip_interfaces:
5 ----------
6 eth0:
7 - 172.16.1.11
8 - fe80::20c:29ff:fe95:1b7a
9 eth1:
10 - 10.0.0.11
11 - fe80::20c:29ff:fe95:1b84
12 lo:
13 - 127.0.0.1
14 - ::1
15 [root@salt100 salt]# salt -G 'ip_interfaces:eth0:172.16.1.11' cmd.run 'whoami'
16 salt01:
17 root
18 [root@salt100 salt]# salt -G 'ip_interfaces:eth1:10.0.0.11' cmd.run 'whoami'
19 salt01:
20 root
9. 在top file中使用grains
9.1. top.sls编写
代码语言:javascript复制 1 [root@salt100 salt]# pwd
2 /srv/salt
3 [root@salt100 salt]# cat top.sls
4 base:
5 # 使用通配符 暂时注释掉
6 # 'salt0*':
7 # - web.apache
8 # - web.nginx # 可以有多个
9 # 指定具体minion
10 'salt03':
11 - web.apache
12 # 使用grains匹配,添加如下几行
13 'roles:webserver03':
14 - match: grain
15 - web.apache
9.2. state.highstate执行
首先通过grains查看salt01和salt02 的roles信息
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt01' grains.item roles
2 salt01:
3 ----------
4 roles:
5 - webserver03
6 - memcache03
7 [root@salt100 salt]# salt 'salt02' grains.item roles
8 salt02:
9 ----------
10 roles:
执行结果
代码语言:javascript复制 1 [root@salt100 salt]# salt 'salt01' state.highstate test=True # 执行正常
2 ………………
3 [root@salt100 salt]# salt 'salt01' state.highstate # 执行正常
4 ………………
5 [root@salt100 salt]# salt 'salt02' state.highstate test=True # 执行异常【top.file 中没有该匹配】
6 salt02:
7 ----------
8 ID: states
9 Function: no.None
10 Result: False
11 Comment: No Top file or master_tops data matches found.
12 Changes:
13
14 Summary for salt02
15 ------------
16 Succeeded: 0
17 Failed: 1
18 ------------
19 Total states run: 1
20 Total run time: 0.000 ms