1. 程式人生 > >SaltStack資料系統之Grains

SaltStack資料系統之Grains

什麼是Grains

Grains是SaltStack的一個元件,存放著minion啟動時收集的底層系統的靜態資訊。Grains中包含諸如執行的作業系統、核心版本、CPU個數、記憶體、主機名、IP地址、物理裝置型號、甚至機器的SN號等非常多的資訊。

Grains是儲存在minion端的,當minion啟動時,會進行Grains的採集工作,然後儲存下來。在以後的生命週期(再次重啟minion,會重新收集)是不會發生變化的,所以是靜態資料。你可能已經想到這些資料可以用來做資產管理的資訊收集。

Grains應用場景

  • Grains可以在state系統中使用,用於配置管理模組。
  • Grains可以target中使用,在用來匹配Minion,比如匹配作業系統,使用-G選項。
  • Grains可以用於資訊查詢,Grains儲存著收集到的客戶端的詳細資訊。

Grains使用案例

 1.Grains 資訊查詢

列出Minion上所有可用的grains的名稱。

# salt ‘*’ grains.ls

列出Minion上所有grains的的名稱及內容。

# salt ‘*’ grains.items

查詢salt版本

# salt ‘*’ grains.get saltversion

查詢eth0 所有IP 地址

# salt ‘*’ grains.get ip_interfaces:eth0

 2.使用Grains匹配Minion

匹配所有系統是CentOS的客戶端,並執行命令:

SaltStack資料系統

3.在Top檔案中使用Grains匹配

Grains

這樣我們可以使用grains進行非常靈活的來選擇對應的伺服器。

4.在States檔案中配合jinja模板使用Grains內容做判斷

例如如果你的環境中有CentOS還有Debian系統,那麼在快速入門中我們編寫的apache.sls需要修改為下面的內容:

minion

因為CentOS和Debian的apache的包名稱是不同的,我們可以通過grains的os獲取到作業系統名稱,然後進行判斷。注意這個{% … %}{% elif … %}{% endif %}是jinja模版。

自定義Grains

內建的Grains不一定能滿足所有需求,所以SaltStack支援在Minion的配置檔案中靜態定義Grains,或者在/etc/salt/grains中,推薦後者。比如我們將一臺伺服器打一個標籤。說明它是一臺Nginx,執行在OpenStack平臺中。這樣我們在以後做遠端管理的時候,比如重啟下所有的Nginx服務,就可以通過這個自定義的Grains來進行了。

# vim /etc/salt/grains

roles: nginx

dept: dev

cloud: openstack

還記得前面說的Grains的特點嗎,必須重啟Minion才會重新收集Grains。

# /etc/init.d/salt-minion restart

重啟minion服務後,使用grains.item就可以列出roles等自定義的grains。

# salt ‘*’ grains.item roles

linux-node2.example.com:

roles: nginx

是不是覺得系統自帶的Grains不夠用,配置檔案寫Grains又不靈活,那麼沒關係,SaltStack支援你自己編寫Grains。

編寫Grains

在minion配置檔案中定義的grains是靜態的,不能夠動態的在minion上生成。可以用Python非常方便的寫動態的grains。minion啟動時,會執行grains包所帶的模組及自定義grains模組中的函式,返回的結果就是grains。grains模組中的函式必須返回一個dict,其中key是grains的名字,value是值。

這裡的動態 grains 是指 minion 啟動時動態生成,事先並不知道內容,在啟動後,這些值依然是不變的。

自定義Grains

很明顯,自定義的grains並不是直接放在minion上,而是放在master配置檔案中定義的file_roots下的_grains目錄中。執行state.highstate,saltutil.sync_grains,saltutil.sync_all時,會將_grains中的檔案分發到客戶端上。

假定file_roots為/srv/salt,增加自定義grain的操作如下:

# mkdir /srv/salt/_grains/

非常簡單的案例

下面我們來編寫grains,記住:必須返回一個字典!

grains

重新整理grains

SaltStack

重新整理後,我們自定義的grains指令碼會存放在minion配置檔案制定的cache目錄下:

[[email protected]~]# ls -l /var/cache/salt/minion/extmods/grains

總用量 8

-rw-r–r– 1 root root 120 11月 6 17:39 my_grain.py

現在我們可以獲取到我們自己編寫的grains。同時,除了執行saltutil.sync_grains進行重新整理外,也可以執行saltutil.sync_grains進行重新整理操作。或者在我們執行state.highstate的時候也會自動進行重新整理。

Grains的優先順序

到目前位置,我們知道Grains有四種存放的方法,或者說是位置:SaltStack自帶的Grains,自定義的Grains和我們編寫的grains的模組返回的Grains,如果grains的名稱一樣,到底以哪個為準呢?優先順序從低到高如下:

  1. 系統自帶grains
  2. /etc/salt/grains裡面指定的grains
  3. /etc/salt/minion裡面設定的grains
  4. 自已編寫的grains模組

作者:趙舜東(趙班長)

來源:運維社群