SaltStack 學習筆記 - 第五篇: 詳解Grain

什麼是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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章