什么是Grains

    Grains是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息。在执行salt的sls时候可以根据Grains信息的不同对服务器进行匹配分组,例如可以根据系统是centos服务器跟系统是redhat环境的安装不同的软件包。

Grains是什么样子

下面是一台自己做测试的虚拟机的粒子信息

列出Grains

可利用的grains信息可以通过'grains.ls'这个模块列出来

salt '*' grains.lskaibin.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.itemskaibin-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 osmaster:    ----------    os:        CentOSkaibin.test2:    ----------    os:        CentOS

2.只得到value

[root@master ~]# salt '*' grains.get osmaster:    CentOSkaibin.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.pingkaibin-test3:    Truekaibin-test2:    True#对cpu架构是x86_64的服务器显示CPU的个数[root@kaibin-test1 ~]# salt -G 'cpuarch:x86_64' grains.item num_cpuskaibin-test2:    ----------    num_cpus:        1kaibin-test3:    ----------    num_cpus:        1#根据主机名进行ping测试[root@kaibin-test1 ~]# salt -G 'host:kaibin-test*' test.pingkaibin-test3:    Truekaibin-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_grainsmaster:kaibin.test2:

查看grains信息

[root@master ~]# salt 'kaibin.test2' grains.itemskaibin.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 webkaibin.test2:    ----------    web:        nginx

方案二: minion端创建单独配置文件

minion端:

[root@kaibin-test2 ~]# cat >> /etc/salt/grains << EOF> database: mysql> EOF

master端:

[root@master ~]# salt '*' saltutil.sync_grainsmaster:kaibin.test2:
[root@master ~]# salt 'kaibin.test2' grains.item databasekaibin.test2:    ----------    database:        mysql

Grains的四种存在形式

Core grains.在 /etc/salt/grains 自定义grains.在 /etc/salt/minion 自定义grains.在 _grains 目录自定义grain,同步到minions.

自定义的grains编写格式参考上面grains.items显示出来的格式

  1. 直接值对应

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  - memcachedeployment: datacenter4cabinet: 13cab_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