什麼是Grains
Grains是伺服器的一系列粒子資訊,也就是伺服器的一系列實體,軟體環境資訊。在執行salt的sls時候可以根據Grains資訊的不同對伺服器進行比對分組,例如可以根據系統是centos伺服器跟系統是redhat環境的安裝不同的軟體包。
Grains是什麼樣子
下面是一台自己做測試的虛拟機的粒子資訊
列出Grains
可利用的grains資訊可以通過'grains.ls'這個子產品列出來
salt '*' grains.ls
kaibin.test3:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
- host
- hwaddr_interfaces
- id
- ip4_interfaces
- ip6_interfaces
- ip_interfaces
- ipv4
- ipv6
- kernel
- kernelrelease
- locale_info
- localhost
- machine_id
- manufacturer
- master
- mem_total
- nodename
- num_cpus
- num_gpus
- os
- os_family
- osarch
- oscodename
- osfinger
- osfullname
- osmajorrelease
- osrelease
- osrelease_info
- path
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- virtual
- zmqversion
grains資訊也可以通過'grains.modules'這個子產品羅列出來
root@kaibin-test1 ~]# salt '*' grains.items
kaibin-test2:
----------
SSDs:
biosreleasedate:
07/31/2013
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
- pge
- mca
- cmov
- pat
- pse36
- clflush
- dts
- mmx
- fxsr
- sse
- sse2
- ss
- syscall
- nx
- rdtscp
- lm
- constant_tsc
- up
- arch_perfmon
- pebs
- bts
- xtopology
- tsc_reliable
- nonstop_tsc
- aperfmperf
- unfair_spinlock
- pni
- pclmulqdq
- ssse3
- cx16
- pcid
- sse4_1
- sse4_2
- x2apic
- popcnt
- aes
- xsave
- avx
- f16c
- rdrand
- hypervisor
- lahf_lm
- ida
- arat
- epb
- xsaveopt
- pln
- pts
- dts
- fsgsbase
- smep
cpu_model:
Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
cpuarch:
x86_64
domain:
com
fqdn:
kaibin-test2.com
fqdn_ip4:
- 192.168.3.120
fqdn_ip6:
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
unknown
host:
kaibin-test2
hwaddr_interfaces:
----------
eth1:
00:0c:29:fa:af:46
lo:
00:00:00:00:00:00
id:
kaibin-test2
ip4_interfaces:
----------
eth1:
- 192.168.3.120
lo:
- 127.0.0.1
ip6_interfaces:
----------
eth1:
- fe80::20c:29ff:fefa:af46
lo:
- ::1
ip_interfaces:
----------
eth1:
- 192.168.3.120
lo:
- 127.0.0.1
ipv4:
- 127.0.0.1
- 192.168.3.120
ipv6:
- ::1
- fe80::20c:29ff:fefa:af46
kernel:
Linux
kernelrelease:
2.6.32-431.el6.x86_64
locale_info:
----------
defaultencoding:
UTF8
defaultlanguage:
zh_CN
localhost:
kaibin-test2
machine_id:
0ecb13dd6ffa324198c2ad2500000010
manufacturer:
VMware, Inc.
master:
192.168.3.110
mem_total:
482
nodename:
kaibin-test2
num_cpus:
1
num_gpus:
1
os:
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
Final
osfinger:
CentOS-6
osfullname:
CentOS
osmajorrelease:
6
osrelease:
6.5
osrelease_info:
- 6
- 5
path:
/sbin:/usr/sbin:/bin:/usr/bin
productname:
VMware Virtual Platform
ps:
ps -efH
pythonexecutable:
/usr/bin/python
pythonpath:
- /usr/bin
- /usr/lib64/python26.zip
- /usr/lib64/python2.6
- /usr/lib64/python2.6/plat-linux2
- /usr/lib64/python2.6/lib-tk
- /usr/lib64/python2.6/lib-old
- /usr/lib64/python2.6/lib-dynload
- /usr/lib64/python2.6/site-packages
- /usr/lib64/python2.6/site-packages/gst-0.10
- /usr/lib64/python2.6/site-packages/gtk-2.0
- /usr/lib64/python2.6/site-packages/webkit-1.0
- /usr/lib/python2.6/site-packages
pythonversion:
- 2
- 6
- 6
- final
- 0
saltpath:
/usr/lib/python2.6/site-packages/salt
saltversion:
2014.7.0
saltversioninfo:
- 2014
- 7
- 0
- 0
selinux:
----------
enabled:
True
enforced:
Enforcing
serialnumber:
VMware-56 4d aa 3f 5b e6 bb d1-2a e1 f3 53 79 fa af 3c
server_id:
421678949
shell:
/bin/bash
virtual:
VMware
zmqversion:
3.2.4
得到各個minion端單一粒子資訊
1、得到key/value
[root@master ~]# salt '*' grains.item os
master:
----------
os:
CentOS
kaibin.test2:
----------
os:
CentOS
2.隻得到value
[root@master ~]# salt '*' grains.get os
master:
CentOS
kaibin.test2:
CentOS
從上面的資訊可以看出,grains其實是一系列的伺服器資訊,從資訊裡可以看到伺服器是一台VMware 虛拟機,系統是centos6.5,cpu是酷睿I5。通常我們進行采購都是一批次的産品,是以使用grains可以輕易的進行批量管理。當然,也可以通過自定義grains來分組管理我們的伺服器。
怎麼運用Grains
第一種,指令行中使用,salt 指令中使用grains
#對系統是CentOS的伺服器進行ping測試操作
#os:CentOS ; 就是對應上面grains.items顯示出來的os值是CentOs的對象進行比對
[root@kaibin-test1 ~]# salt -G 'os:CentOS' test.ping
kaibin-test3:
True
kaibin-test2:
True
#對cpu架構是x86_64的伺服器顯示CPU的個數
[root@kaibin-test1 ~]# salt -G 'cpuarch:x86_64' grains.item num_cpus
kaibin-test2:
----------
num_cpus:
1
kaibin-test3:
----------
num_cpus:
1
#根據主機名進行ping測試
[root@kaibin-test1 ~]# salt -G 'host:kaibin-test*' test.ping
kaibin-test3:
True
kaibin-test2:
True
第二種,在SLS中使用grains
# 在top.sls中使用grais
'os:CentOS':
- match: grain
- webserver
上面是在top.sls中定義對系統是CentOs的伺服器執行webserver.sls定義的狀态資訊.
進階,自定義Grains
自定義grains資訊:
靜态資料存放在slave端(定義在minion端)
方法一:
生效方式:
1.重新開機minion端
2.master端重新整理grains資訊
[root@master ~]# salt '*' saltutil.sync_grains
master:
kaibin.test2:
檢視grains資訊
[root@master ~]# salt 'kaibin.test2' grains.items
kaibin.test2:
----------
SSDs:
biosreleasedate:
07/31/2013
biosversion:
6.00
cpu_flags:
........
shell:
/bin/bash
virtual:
VMware
web:
nginx
zmqversion:
3.2.4
[root@master ~]# salt 'kaibin.test2' grains.item web
kaibin.test2:
----------
web:
nginx
方案二: minion端建立單獨配置檔案
minion端:
[root@kaibin-test2 ~]# cat >> /etc/salt/grains << EOF
> database: mysql
> EOF
master端:
[root@master ~]# salt '*' saltutil.sync_grains
master:
kaibin.test2:
[root@master ~]# salt 'kaibin.test2' grains.item database
kaibin.test2:
----------
database:
mysql
Grains的四種存在形式
Core grains.
在 /etc/salt/grains 自定義grains.
在 /etc/salt/minion 自定義grains.
在 _grains 目錄自定義grain,同步到minions.
自定義的grains編寫格式參考上面grains.items顯示出來的格式
- 直接值對應
os:CentOS
2. 字典格式
ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
3. 分多行值的清單格式
osmajorrelease:
6
5
- Core Grains : 是salt定義好的grains,後面三種自定義的grains,如果名稱跟Core grains定義的一樣,将會覆寫掉Core grains定義的值.
- /etc/salt/grains : 單獨的grains來放置自定義的grains可以更加好的獨立***。
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
* 上面的内容定義了四個grain。 roles是一個清單,還有deployment,cabinet,cab_u三個值
* 需要重新開機minion才能生效
- /etc/salt/minion : 這個的定義跟在/etc/salt/grains中的定義一樣,隻不過要多個grains的聲明
grains :
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
- _grains 目錄自定義grain :
假設使用預設的master 的file_roots配置路徑 /srv/salt ,那麼_grains的位置是/srv/salt/_grains
# mkdir /srv/salt/_grains
# vim /srv/salt/_grains/my_grain.py
## 添加下面内容
def my_grains():
grains = {'roles' : ['phpserver','webserver']}
return grains
# salt '192.168.0.100' saltutil.sync_grains
# salt '192.168.0.100' grains.item roles
這裡是通過定以一個grains子產品注入給minion一個roles資訊。
如果查詢grains.items roles無法查出相關資訊,可以重新開機下master,再重新測試
saltutil.sync_grainsdef _windows_cpudata():
'''
Return some CPU information on Windows minions
'''
# Provides:
# num_cpus
# cpu_model
grains = {}
if 'NUMBER_OF_PROCESSORS' in os.environ:
# Cast to int so that the logic isn't broken when used as a
# conditional in templating. Also follows _linux_cpudata()
try:
grains['num_cpus'] = int(os.environ['NUMBER_OF_PROCESSORS'])
except ValueError:
grains['num_cpus'] = 1
grains['cpu_model'] = platform.processor()
return grains
### 下面的三個操作均會将自定義的grains分發到192.168.0.100上
#salt '192.168.0.100' state.highstate
#salt '192.168.0.100' saltutil.sync_all
#salt '192.168.0.100' saltutil.sync_grains