簡介
Grains 是SaltStack 的重要組件之一。主要記錄minion的靜態信息,比如CPU,內存,磁盤,網絡信息等。Grains信息是minion啟動時匯報給Master的。
刷新grains方法:
(1)重啟minion
(2)Master強制刷新: salt '*' saltutil.sync_grains
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 內容

[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的方式:
(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