Salt的網站上有兩篇關於Pillar的文檔(一,二),其中一篇內容不多,我以爲寫成一篇文章更合適。本文的邏輯結構沒有參照官方文檔,而是根據我本身對Pillar的理解組織內容,但願可以把這個概念解釋清楚。文中的示例代碼來自官方文檔。html
我只是SaltStack的初學者,若是文中有錯誤的地方,請不吝賜教。 在學習的過程,我作了一些實驗,犯了很多錯,積累了一些經驗,對SaltStack的運行也有必定了解,若是有什麼問題,或是不太理解的地方,很是歡迎留言交流!git
Pillar是Salt很是重要的一個組件,它用於給特定的minion定義任何你須要的數據,這些數據能夠被Salt的其餘組件使用。Salt在0.9.8版本中引入了Pillar。Pillar在解析完成後,是一個嵌套的dict結構;最上層的key是minion ID,其value是該minion所擁有的Pillar數據;每個value也都是key/value。apache
這裏能夠看出Pillar的一個特色,Pillar數據是與特定minion關聯的,也就是說每個minion都只能看到本身的數據,因此Pillar能夠用來傳遞敏感數據(在Salt的設計中,Pillar使用獨立的加密session,也是爲了保證敏感數據的安全性)。vim
-I
選項。默認狀況下,master配置文件中的全部數據都添加到Pillar中,且對全部minion可用。若是要禁用這一默認值,能夠在master配置文件中添加以下數據,重啓服務後生效:安全
pillar_opts: False
Pillar使用與State類似的SLS文件。Pillar文件放在master配置文件中pillar_roots
定義的目錄下。示例以下:session
pillar_roots: base: - /srv/pillar
這段代碼定義了base環境下的Pillar文件保存在/srv/pillar/
目錄下。與State類似,Pillar也有top file
,也使用相同的匹配方式將數據應用到minion上。示例以下:
/srv/pillar/top.sls:ssh
base: '*': - data - packages
/srv/pillar/packages.sls:學習
{% if grains['os'] == 'RedHat' %} apache: httpd git: git {% elif grains['os'] == 'Debian' %} apache: apache2 git: git-core {% endif %}
/srv/pillar/data/init.sls:網站
role: DB_master
這段代碼表示,base環境中全部的minion都具備packages和data中定義的數據。Pillar採用與file server
相同的文件映射方式,在本例中,packages映射到文件/srv/pillar/packages.sls
,data映射到/srv/pillar/data/init.sls
。注意key與value要用冒號加空格分隔,沒有空格的話將解析失敗。ui
Pillar還可使用其餘的匹配方式來選擇minion,下面的例子中,servers只應用到操做系統是Debain的機器:
dev: 'os:Debian': - match: grain - servers
使用執行模塊pillar。pillar模塊有兩個funtion:pillar.data和pillar.raw。示例以下:
# salt '*' pillar.data
在master上修改Pilla文件後,須要用如下命令刷新minion上的數據:
salt '*' saltutil.refresh_pillar
若是定義好的pillar不生效,建議刷新一下試試。
Pillar解析後是dict對象,直接使用Python語法,能夠用索引(pillar['pkgs']['apache']
)或get方法(pillar.get('users', {})
)。詳見下面的例子。
使用-I
選項表示使用Pillar來匹配minion.
salt -I 'role:DB*' test.ping
Pillar的key/value結構中的value能夠是string,也能夠是一個list。Pillar文件定義以下:
/srv/pillar/users/init.sls:
users: thatch: 1000 shouse: 1001 utahdave: 1002 redbeard: 1003
在top.sls中引用Pillar文件,對全部的minion應用users中的內容:
/srv/pillar/top.sls:
base: '*': - data - users
如今全部的minion都具備了users數據,能夠在state文件中使用:
/srv/salt/users/init.sls:
{% for user, uid in pillar.get('users', {}).items() %} {{user}}: user.present: - uid: {{uid}} {% endfor %}
不一樣的操做系統不只管理資源的方式不一樣,軟件包的名字、配置文件的路徑也有有可能不同。Salt的執行模塊屏蔽了系統管理資源的差別。其餘的差別能夠根據grains中的的os、cpuarch等信息來處理,這些條件判斷能夠寫在State文件中,但會使得State文件的邏輯不清晰。Pillar能夠很好地解決這個問題。下面的例子中,在不一樣的os上安裝對應的軟件包,但state file徹底同樣,不須要針對os做修改,靈活方便。
/srv/pillar/pkg/init.sls:
pkgs: {% if grains['os_family'] == 'RedHat' %} apache: httpd vim: vim-enhanced {% elif grains['os_family'] == 'Debian' %} apache: apache2 vim: vim {% elif grains['os'] == 'Arch' %} apache: apache vim: vim {% endif %}
/srv/pillar/top.sls:
base: '*': - data - users - pkg
/srv/salt/apache/init.sls:
apache: pkg.installed: - name: {{ pillar['pkgs']['apache'] }}
還能夠在state file中設置默認值: srv/salt/apache/init.sls:
apache: pkg.installed: - name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}