天天看點

SaltStack學習筆記(三)詳解Grain

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

方法一:

SaltStack學習筆記(三)詳解Grain

生效方式:

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顯示出來的格式

  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
  - 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      

繼續閱讀