什么是Grains

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


Grains是什么样子

下面是一台Dell R420的粒子信息

[root@yw_home ~]# salt 192.168.0.100 grains.items
192.168.0.100:
  biosreleasedate: 03/11/2013
  biosversion: 1.5.2
  cpu_flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
  cpu_model: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
  cpuarch: x86_64
  defaultencoding: UTF8
  defaultlanguage: en_US
  domain: localdomain
  external_ip: 192.168.0.100
  fqdn: localhost.localdomain
  fqdn_ip4:
      127.0.0.1
  fqdn_ip6:
      ::1
  gpus:
      {'model': 'G200eR2', 'vendor': 'unknown'}
  host: localhost
  hwaddr_interfaces: {'lo': '00:00:00:00:00:00', 'em1': '保密隐去', 'em2': '保密隐去'}
  id: 192.168.0.100
  ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
  ipv4:
      127.0.0.1
      192.168.0.100
  ipv6:
      ::1
      fe80::92b1:1cff:fe50:d4ac
  kernel: Linux
  kernelrelease: 2.6.32-431.el6.x86_64
  localhost: 192.168.0.100
  manufacturer: Dell Inc.
  master: 192.168.0.100
  mem_total: 64377
  nodename: 192.168.0.100
  num_cpus: 24
  num_gpus: 1
  os: CentOS
  os_family: RedHat
  osarch: x86_64
  oscodename: Final
  osfinger: CentOS-6
  osfullname: CentOS
  osmajorrelease:
      6
      5
  osrelease: 6.5
  path: /sbin:/usr/sbin:/bin:/usr/bin
  productname: PowerEdge R420
  ps: ps -efH
  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/gtk-2.0
      /usr/lib/python2.6/site-packages
      /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info
  pythonversion: 2.6.6.final.0
  saltpath: /usr/lib/python2.6/site-packages/salt
  saltversion: 2014.1.0
  saltversioninfo:
      2014
      1
      0
  serialnumber: 保密隐去
  server_id: 保密隐去
  shell: /bin/sh
  virtual: physical


从上面的信息可以看出,grains其实是一系列的服务器信息,从信息里可以看到服务器是一台dell r420型号的物理机器,系统是centos6.5,cpu是E5-2420 24核。通常我们进行采购都是一批次的产品,所以使用grains可以轻易的进行批量管理。当然,也可以通过自定义grains来分组管理我们的服务器。



怎么运用Grains


第一种,命令行中使用,salt 命令中使用grains

#对系统是CentOS的服务器进行ping测试操作
#os:CentOS ; 就是对应上面grains.items显示出来的os值是CentOs的对象进行匹配 
salt -G 'os:CentOS' test.ping

#对cpu架构是x86_64的服务器显示CPU的个数
salt -G 'cpuarch:x86_64' grains.item num_cpus

#对字典值的对象进行匹配
salt -G 'ip_interfaces:em1:192.168.0.*'


第二种,在SLS中使用grains

# 在top.sls中使用grais

'os:CentOS':
    - match: grain
    - webserver


上面是在top.sls中定义对系统是CentOs的服务器执行webserver.sls定义的状态信息.



进阶,自定义Grains


Grains的四种存在形式

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


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

  • 直接值对应 

os:CentOS
  • 字典格式

ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
  • 分多行值的列表格式

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