天天看點

SaltStack Grains 詳解

簡介

  Grains 是SaltStack 的重要元件之一。主要記錄minion的靜态資訊,比如CPU,記憶體,磁盤,網絡資訊等。Grains資訊是minion啟動時彙報給Master的。

重新整理grains方法:

  (1)重新開機minion

  (2)Master強制重新整理: salt '*' saltutil.sync_grains

Grains 相關方法

SaltStack Grains 詳解
SaltStack Grains 詳解
Grains:
    - grains.append  # 向grains中添加key/value, 不存在則建立,存在則追加,被追加的key将有兩個值,salt '*' grains.append key val. 特别注意:append 操作要時 key必須是個清單
    - grains.delkey  # 删除指定的grains key,value也會一起删除。salt '*' grains.delkey key
    - grains.delval  # 删除指定的grains key 的 value值,并不會删除key,主要注意删除value後會将value變成None. salt '*' grains.delval key
    - grains.equals  # 判斷key/value 是否比對,比對傳回True,反之則為False.  salt '*'  grains.equals key value
    - grains.fetch   # 擷取指定key的value值,如果不存在則傳回空字元串,和get類似。 salt "*" grains.fetch key
    - grains.filter_by # 過濾查找
    - grains.get     # 擷取, 和fetch類似
    - grains.get_or_set_hash # salt '*' grains.get_or_set_hash 'django:SECRET_KEY' 50
    - grains.has_value       # salt '*' grains.has_value pkg:apache
    - grains.item   # 擷取指定grains item資訊(也可以擷取多個,多個用空格分隔),例如: grains.item wan, 擷取wan的資訊
                    [root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*'  grains.item wan
                    minion:
                        ----------
                        wan:
                            41.2.2.2
    - grains.items  # 擷取minion的所有grains item資訊
    - grains.ls     # 擷取grains的所有item key值    
    - grains.remove # 和append 對應,移除grains key 的value 清單中的一個。salt '*' grains.remove key val
    - grains.set    # 設定key 為任意值,value是嵌套模式的。
                    # salt '*' grains.set 'apps:myApp:port' 2209 
                    # salt '*' grains.set 'apps:myApp' '{port: 2209}'
    - grains.setval # 設定key . salt '*' grains.setval key val 
                    # salt '*' grains.setval key "{'sub-key': 'val', 'sub-key2': 'val2'}"
                    [root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.setval key11 "{'sub-key': 'val', 'sub-key2': 'val2'}"
                    minion:
                        ----------
                        key11:
                            ----------
                            sub-key:
                                val
                            sub-key2:    
                                val2
                    [root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.item key11:sub-key
                    minion:
                        ----------
                        key11:sub-key:
                            val
                    [root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.item key11:sub-key2
                    minion:
                        ----------
                        key11:sub-key2:
                            val2
    - grains.setvals # 設定多個key/value,salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"
                    [root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"
                    minion:
                        ----------
                        key1:
                            val1
                        key2:
                            val2      

Grains 方法說明

系統預設Grains 内容

SaltStack Grains 詳解
SaltStack Grains 詳解
[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内容

自定義Grains

  當我們需求更多,預設grains不能滿足時,可以自定義grains.

自定義Grains的方式:

  (1)通過minion配置檔案定義, 優先級1

  (2)通過Master端對Grains定義,優先級3

  (3)通過Master端python腳本定義, 優先級2

自定義grains優先級:

  minion配置檔案定義 > master端自定義grains腳本 > master端grains子產品定義。

特别注意:

  在 /src/salt/_grains目錄下的自定義腳本,在執行完成後,建議移到一個Bak目錄,確定_grains中沒有殘留檔案,并在執行一次salt'*'saltutil.sync_grains操作。

使minion主機上自定義子產品目錄是幹淨的,這樣做的好處是可以避免和另外兩個檔案有配置沖突,也避免腳本之間有重複的名字定義,造成取值結果錯誤。

(1)minion配置檔案定義

  在minion端,grains 預設的配置檔案路徑寫在minion檔案中:default_include: minion.d/*.conf , 需要自己建立 *.conf 這個檔案。并在檔案中按照YAML格式編寫grains配置檔案。

需要重新開機Minion後 Master才能擷取最新的grains資訊(或者Master主動去重新整理)。

# cat grains.conf
# 特别注意 :和 - 後面需要接一個空格,段落開頭是2個空格間距
grains:
  roles:
    - webserver
    - memcache
  deployment: datacenter4
  cabinet: 13
  cab_u: 14-15
  serverid: 1001
# Master 檢視grains資訊
[root@saltmaster salt]# salt 'salt-min*' grains.item serverid
salt-minion-1:
    ----------
    serverid:
        1001      

(2)Master端對Grains定義

  通過Master 直接給minion 設定Grains資料,而且不需要重新開機minion,即可生效。通過Master設定的Grains資料儲存在minion端的/etc/salt/grains 檔案中。格式依舊遵循YAML。

# Master 向 Minion 添加一個name變量,内容為node1
[root@saltmaster salt]# salt 'salt-min*' grains.append name 'node1'
salt-minion-1:
    ----------
    name:
        - node1
# 在次向name變量添加内容時,并不會覆寫,而是追加,name将有2個值
[root@saltmaster salt]# salt 'salt-min*' grains.append name 'node2'
salt-minion-1:
    ----------
    name:
        - node1
        - node2
# Master 向 Minion 添加多個資料,通過grains.setvals 内容則是一個字典的形式
[root@saltmaster salt]# salt 'salt-min*' grains.setvals "{'serverid':'1002','other':'hi'}"   
salt-minion-1:
    ----------
    other:
        hi
    serverid:
        1002
# Master 擷取指定Minion 中 grains資料值, grains.item 直接加變量名(一個或多個皆可)
[root@saltmaster salt]# salt 'salt-min*' grains.item name serverid
salt-minion-1:
    ----------
    name:
        - node1
        - node2
    serverid:
        1001
# Master 直接擷取 Minion 的Grains變量内容
[root@saltmaster salt]# salt 'salt-min*' grains.get name
salt-minion-1:
    - node1
    - node2      

(3)Master端python腳本定義

  預設自定義腳本需要放在 Master 的 /srv/salt/_grains 目錄下, 這個目錄需要自己建立。同步到Minion的腳本會被放在 minion 的 /var/cache/salt/minion/extmods/grains/ 。

# 自定義grains python腳本格式,類似于建立一個grains空字典并添加一對key/value:
def 自定義函數名():
    grains = {}
    grains['需要添加的grain item 名字'] = 指令行擷取方法
    return grains

# 擷取系統時間的示例
[root@salt-minion-1 salt]# cat /var/cache/salt/minion/extmods/grains/get_time.py
#!/usr/bin/python env
# coding=utf-8
from datetime import datetime
def get_server_time():
    grains = {}
    grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return grains
# 使用 sync_grains 指令同步腳本到Minion主機上,并通過grains.item 指令擷取相關資訊即可。
[root@saltmaster salt]# salt "*" saltutil.sync_grains
saltmaster:
    - grains.get_time
salt-minion-1:
    - grains.get_time
[root@saltmaster salt]# salt '*' grains.item server_time
salt-minion-1:
    ----------
    server_time:
        2017-06-08 16:56:55
saltmaster:
    ----------
    server_time:
        2017-06-08 16:56:54
# Minion 存放 Master 同步來的腳本目錄
[root@salt-minion-1 salt]# ll /var/cache/salt/minion/extmods/grains/
total 8
-rw-------. 1 root root 197 Jun  8 16:56 get_time.py
-rw-------. 1 root root 443 Jun  8 16:56 get_time.pyc      

繼續閱讀