官方文檔地址:http://docs.saltstack.com/topics/tutorials/pillar.html
Pillar Walkthrough
Note
閱讀這份手冊之前,假定讀者已經完成了Salt Stack基礎 手冊的閱讀。
Pillar接口是Salt衆多組件中最重要的部署組件,Pillar被用來爲特別的從服務器生成特定數據的接口。在Pillar中生成的數據提供給所有的Salt組件並且被用來一下目的:
高度敏感數據:
所有通過pillar傳輸的信息能夠保證被提交給目標主機,這使得Pillar引擎在Salt中被用來管理安全的信息,如,密碼的Key和密碼口令等。
從服務器配置:
從服務模塊如遠程執行模塊,狀態,反饋信息都可以使用存儲在pillar中的數據來配置。
變量:
那些需要分配給特定的從服務器或者羣組的變量可以在pillar中定義並且能夠在SLS配置模板和穩重中使用。
任意數據:
Pillar能夠包含任意基本的數據結構,如,列表數據,或者k/v存儲。可以讓數據容易在SLS文檔中使用。
因此,Pillar是在使用Slat的過程中最重要系統之一,這篇教程設計用來在幾分鐘之內編寫一個簡單的pillar文件,然後運用這個Pillar 使它的數據是可用的在pillar文件中。
設置Pillar
默認情況下,Pillar 已經運行在了Salt系統中,在從服務器上的Pillar的數據能夠通過下面的命令查看到:
# salt '*' pillar.data
默認情況下,主服務器的配置文件內容裝載在fillar中對所用的從服務器來說,通過配置主服務器的配置文件來使全局的從服務器生效。
Pillar是類似內置的state 文件,它有sls文件組成且有一個視圖文件,就像state tree(翻譯爲,state 文件)。相對於state文件,Pillar 存儲在Slat主服務器上的不同目錄。默認的目錄是/srv/pillar
注意:
Pillar的目錄能夠通過修改主服務配置文件中的pillar_roots選項進行更改。
在配置Pillar之前,需要創建/srv/pillar目錄。
# mkdir /srv/pillar
一個簡單的視圖文件,格式類似state,需要創建,其內容如下:
/srv/pillar/top.sls
base:
'*':
- data
視圖文件包含data.sls文件,這個文件在所有的從服務器上生效,/srv/pillar/data.sls文件如下:
/srv/pillar/data.sls
info: some data
至此,保存該文件,從服務器上的pillars信息將被更新:
# salt '*' pillar.data
info關鍵字的信息會出現在返回的pillar數據中
更多複雜的數據:
Pillar文件是SLS文件,像states,但是不想sates文件,他們不需要定義格式,數據可以是任意的,下面的例子中,通過UID設置用戶數據,
/srv/pillar/usrs/init.sls
users:
thatch: 1000
shouse: 1001
utahdave: 1002
redbeard: 1003
注意:
相同的目錄中查找 states文件在Pilla目錄中,因此 users/init.sls文件能夠在視圖文件中被引用。
視圖文件需要更新一下以引用這個sls文件:
/srv/pillar/top.sls
base:
'*':
- data
- users
現在的話,這些數據對從服務器來說是可用的了。使用Jinjia 在state文件中引用pillar 中的數據。
/srv/salt/users/init.sls
{% for user, uid in pillar.get('users', {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
以上可以把users 安全的定義在一個pillar中,並且user 數據可以應用在sls文件中。
Pillar作爲states 的參數
Pillar最重要的一個抽象功能就是能夠作爲states的參數。而不是定義宏或者函數,在states文件內容中,可以自由地參數化相對於所有的從服務器的pillar.
以上的話可以讓Salt變的更加靈活,這意味着一些簡單的sls格式的文件能夠用作結構的參數而不需要重構state文件樹。
一個簡單的例子是根據不同的Linux 分發版本引導安裝不同的軟件包在pillar中定義。
/srv/pillar/pkg/init.sls
pkgs:
{% if grains['os_family'] == 'Debian' %}
apache: httpd
vim: vim-enhanced
{% elif grains['os_family'] == 'RedHat' %}
apache: apache2
vim: vim
{% elif grains['os'] == 'Arch' %}
apache: apache
vim: vim
{% endif %}
這個新的pkg sls需要增加到視圖文件中:
/srv/pillar/top.sls
base:
'*':
- data
- users
- pkg
至此,從服務器將會根據各自的操作系統自動對應在pillar 只內定義的軟件安裝包,所以sls文件可以安全的引用:
/srv/salt/apache/init.sls
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
更或者,假如pillar不可以用,也可以這樣設置缺省值:
NOte:
在這個例子中使用的pillar.get 函數是在Salt 0.14.0版本中增加的。
/srv/salt/apache/init.sls
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
在上面的例子中,假如 pillar 的變量pillar['pkgs'] ['apache'] 在從服務器上沒有被設置,那麼默認的'httpd'將會被使用。
Pillar使簡單的states變的靈活
Pillar其中一個設計目標是使簡單的sls格式變得易用和靈活,而不是需要複雜和重構state文件。
簡單的格式:
/srv/salt/edit/vim.sls
vim:
pkg:
- installed
/etc/vimrc:
file.managed:
- source: salt://edit/vimrc
- mode: 644
- user: root
- group: root
- require:
- pkg: vim
可以很容易地轉換成一個強大的、參數化公式:
/srv/salt/edit/vim.sls
vim:
pkg:
- installed
- name: {{ pillar['pkgs']['vim'] }}
/etc/vimrc:
file.managed:
- source: {{ pillar['vimrc'] }}
- mode: 644
- user: root
- group: root
- require:
- pkg: vim
vimrc的源位置可以通過pillar 改變:
/srv/pillar/edit/vim.sls
{% if grain['id'].startswith('dev') %}
vimrc: salt://edit/dev_vimrc
{% elif grain['id'].startswith('qa') %}
vimrc: salt://edit/qa_vimrc
{% else %}
vimrc: salt://edit/vimrc
{% endif %}
確保正確的vimrc發送正確的從服務器上。
更多關於Pillar
Pillar的數據創建在Salt主服務器上並且安全的分發到從服務器上。Salt當定義pillar的時候 並不侷限於pollar sls 文件,可以從其他額外的源取得數據。對於那些把基礎結構信息存儲在其他的地方會很有用。
參考信息和其他外部Pillar接口可以 在Salt 文檔中找到:
Pillar
http://docs.saltstack.com/topics/pillar/index.html