Grains 是SaltStack 的重要組件之一。主要記錄minion的靜態信息,好比CPU,內存,磁盤,網絡信息等。Grains信息是minion啓動時彙報給Master的。node
刷新grains方法:
(1)重啓minion
(2)Master強制刷新: salt '*' saltutil.sync_grainspython
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
[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.linux
自定義Grains的方式:ios
(1)經過minion配置文件定義, 優先級1
(2)經過Master端對Grains定義,優先級3
(3)經過Master端python腳本定義, 優先級2es6
自定義grains優先級:web
minion配置文件定義 > master端自定義grains腳本 > master端grains模塊定義。shell
特別注意:apache
在 /src/salt/_grains目錄下的自定義腳本,在執行完成後,建議移到一個Bak目錄,確保_grains中沒有殘留文件,並在執行一次salt'*'saltutil.sync_grains操做。django
使minion主機上自定義模塊目錄是乾淨的,這樣作的好處是能夠避免和另外兩個文件有配置衝突,也避免腳本之間有重複的名字定義,形成取值結果錯誤。api
(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