什么是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
* 需要重启minion才能生效
_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,再重新测试
下面给给出一个Core grains定义的一个例子,使用了比较复杂的方式来定义grains,更多的信息点击这里
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到客户端
### 下面的三个操作均会将自定义的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
本文转自:http://arlen.blog.51cto.com/7175583/1424444