七天學會SALTSTACK自動化運維 (2)
-
導讀
-
Grains
-
Pillar
-
總結
- 參考鏈接
導讀
上一篇主要介紹了安裝和基本的使用方法,但是我認為如果理解了相關概念的話,使用會更加順手,因為畢竟每一個組件都是有理由這么做的,并不是亂做的,所以一定要理解這些概念是什么意思,為什么要這樣做,然后必要的時候再去debug代碼。 這里主要介紹Grains和Pillar 這2個概念.
接下來會分別介紹Saltstack中的核心概念,核心概念理解之后,應用起來才會得手,對于trouble shooting也是有很大的幫助.
Grains
Saltstack通過Grains來展示數據, Grans其實就是存儲于minion上的一組靜態數據,它在minion啟動的時候就已經被讀取并且存儲了,不要被它的名字所誤導,就是一組存儲與minion上的數據而已,可以由SLS配置文件來配置來組織自己想要的數據,然后通過在master上通過簡單的命令來獲取,大部分時候可以用于minion的監控。grains的數據好比服務器的硬盤大小,cpu頻率等各種參數.
Grans 是大小寫不敏感的, FOO, foo 會得到相同的返回結果.
獲取grains的值是非常簡單的
salt -G 'A:C' test.echo 'how are you'
如上的命令會去匹配符合具有 'A:B' 的minion,然后在該服務器上執行 test.echo命令, 之前筆者都是使用pcre去匹配minion的id去選定主機的,現在可以使用grains去匹配了,而且grains的匹配也有多種方式,搭配靈活,又比方說如下的命令
salt -G 'A:B:C' test.echo 'how are you again'
這條命令就是用來匹配具有 grains A并且A下有一個字典,字典的內容是 B:C 的minion, 我的配置文件是這樣寫的
grains:
A:
B: C
Grains本身應用起來非常簡單,如果想要獲取全部的grains信息可以使用下面的命令
salt -E mypc grains.ls
salt -E mypc grains.items
這2條命令會獲取一個grains的字典,包含匹配minion的所有grains信息.
Grains的配置
Grains的配置途徑有兩種,可以配置在minion的配置文件中,也可以配置在minion服務器上的/etc/salt/grains中,配置方法大同小異,分別介紹之前,先要說明一件事,在官方的Grains指南當中,大部分的案例都是通過Grains去適配minion的,其實也就是起的一個選擇器的作用,當然你也可以隨意使用grains去做其他的功能,Grains通常用于minion適配非常方便,因為我總不能把mysql版本,apache版本,nginx版本,redis版本全都寫進minion的id里去吧,這是筆者對grains的理解,當然你也應該有自己的理解,畢竟人各不同.
#!/usr/bin/env python
def my_grains():
grains = dict(user='younger')
return grains
這樣定義的腳本會被分發到minion,可以隨意寫入信息,腳本的位置應該是在一個叫做 **_grains** 的文件夾中,該文件夾位置與 master配置文件中的 file_roots 中所配置的路徑相同, 腳本寫好之后,經過
sudo salt -E mypc state.highstate
這條命令之后才可以通過 grains.get 獲取, 按照文檔中說法, 必須每次都執行在minion啟動的時候都執行這條命令,文檔中有一個 補救方法 ,文中描述了一個先有雞還是先有蛋的ISSUE(# TODO),有待深入研究,通過文中的reactor,便可以解決在啟動minion的時候順便同步grains的問題。
最后關于grains還有一個優先級別的問題,由于有多種方式定義grains,而系統本身又帶有自己的grains,所以就要小心在自定義grains的時候,覆蓋系統自帶的grain,除非你是故意這么做的。
1 Core grains.
2 Custom grain modules in _grains directory, synced to minions.
3 Custom grains in /etc/salt/grains.
4 Custom grains in /etc/salt/minion.
上面的列表中,下面的條目會覆蓋上面的條目,目錄 _grains中的grains會覆蓋系統自帶的grians, /etc/salt/grains中的grain會覆蓋前2個級別的grains,/etc/salt/minion 在有定義的情況下,會成為最終的grains,就是會覆蓋其余的所有grains。 核心grains在這里 .
Pillar
Pillar與Grains經常被混淆,這是官方Pillar文檔里的說法,當然,就在昨天的之后我基本還不知道Pillar與Grains的區別,不過現在知道了,要分清楚2者是很簡單的
1 前者master定義傳給minion,后者minion自己定義
2 前者是存儲在master上的,后者基本上全部存儲于minion上
3 前者可以動態定義,后者是靜態常量
從文檔來看,Pillar基本上是作用于動態配置管理上的,基本的應用場景比如,a, b, 2臺vps,一個是dev,是一個prod, 這2個服務器的grains中都有一個叫做ENV的值,值分別是 dev和prod, 在請求django的配置文件的時候,需要做highstate,這個時候把watch的config文件名寫在pillar里, pillar里的邏輯是根據不同的grains值返回不同的結果,這里是文件名,這樣不同的minion,在highstate的時候,就會獲取不同的配置文件, 這個是很簡單的場景, 當然你也可以直接在sls里配置。 更通用的情況是傳輸密碼之類的敏感數據,這樣不僅好管理,而且也更安全, 不用每次登陸ssh然后改完之后再改另一個,突觸一個批量修改。具體請參見文檔中的4個應用場景,不過一定要記住,pillar是動態的數據,可以寫到變量里,然后根據不同的情況用不通的值,基本上就是這么個用法。
現在來看一個簡單的例子
pillar的配置路徑要在master的配置文件里設置, pillar_roots, 這里我使用默認的路徑,也就是 /etc/pillar, 沒有的話就直接建立相應文件,我的配置里一共有2個文件,分別如下
top.sls
base:
'*':
- config
-------------------------------------------------------
config.sls
{% if grains['env'] == 'development'%}
config: dev
{% else %}
config: prod
{% endif %}
這個是一目了然的例子,模板是jinja2的,模板的使用可以 參考這里 .
當我執行這條命令的時候
sudo salt -E mypc pillar.get config
返回
mypc:
prod
這時候我的env是 development
-------------------------------------
返回
mypc:
dev
這時候我的env配置是其他值
這里只給出在我的理解之上最簡單的用法,實際環境可以按需求慢慢擴展,慢慢學習。
還有一個復雜一點的例子,這個例子用來配置不同apache配置文件,原理就是 讀grains,然后pillar動態生成變量, /etc/salt/web.sls中使用jinja2渲染變量到模板,然后調用 sudo salt -E mypc state.highstate 命令同步文件,根據config grains來復制dev或者prod的配置文件.
/etc/pillar/top.sls
base:
'*':
- config
------------------------
/etc/pillar/config.sls
{% if grains['env'] == 'development'%}
config: dev
{% else %}
config: prod
{% endif %}
-------------------------
/etc/salt/web.sls
apache_config:
file.managed:
- name : /etc/{{ pillar.get('config', 'dev') }}.config
- source: salt://{{ pillar.get('config', 'dev') }}.config
gedit:
pkg.installed:
- watch:
- file: apache_config
/etc/salt/prod.config:
password: 123
/etc/salt/dev.config:
password: 321
比較簡單的例子,功能比上一個復雜不少,具體的可以參見官方文檔.
總結
筆者主要是在研究了好幾篇文檔之后才有的這篇心得,主要是理解概念上,理解之后就可以順著軟件的思路來寫配置了,saltstack可以簡單使用,也可以做非常復雜的分布式配置,單機可以配合花生殼使用,主要看應用場景是什么。
參考鏈接
http://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html(pillar文檔)
http://docs.saltstack.com/en/latest/topics/targeting/grains.html
(grains文檔)
http://docs.saltstack.com/en/latest/topics/reactor/index.html#minion-start-reactorss
(雞蛋問題)
http://docs.saltstack.com/en/latest/ref/renderers/all/salt.renderers.jinja.html
(jinaj2模板)
http://www.shencan.net/index.php/2013/05/24/saltstack-%E4%BA%8C-grains%E5%92%8Cpillar/ (一個友人的grains和pillar教程)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
