SaltStack Grains 詳解

簡介

  Grains 是SaltStack 的重要組件之一。主要記錄minion的靜態信息,好比CPU,內存,磁盤,網絡信息等。Grains信息是minion啓動時彙報給Master的。node

刷新grains方法:
  (1)重啓minion
  (2)Master強制刷新: salt '*' saltutil.sync_grainspython

 

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

[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.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
相關文章
相關標籤/搜索