master配置文件中定義
默認情況下,master配置文件中的所有數據都添加到Pillar中,且對所有minion可用。如果要禁用這壹默認值,可以在master配置文件中添加如下數據,重啟服務後生效:
pillar_opts: False
使用SLS文件定義Pillar
Pillar使用與State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定義的目錄下。示例如下:
pillar_roots:
base:
- /srv/pillar
這段代碼定義了base環境下的Pillar文件保存在/srv/pillar/目錄下。與State相似,Pillar也有top file,也使用相同的匹配方式將數據應用到minion上。示例如下:
/srv/pillar/top.sls:
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要用冒號加空格分隔,沒有空格的話將解析失敗。
Pillar還可以使用其他的匹配方式來選擇minion,下面的例子中,servers只應用到操作系統是Debain的機器:
dev:
'os:Debian':
- match: grain
- servers
如何知道minion擁有哪些Pillar數據?
使用執行模塊pillar。pillar模塊有兩個funtion:pillar.data和pillar.raw。示例如下:
# salt '*' pillar.data
在master上修改Pilla文件後,需要用以下命令刷新minion上的數據:
salt '*' saltutil.refresh_pillar
如果定義好的pillar不生效,建議刷新壹下試試。
Pillar中數據如何使用?
Pillar解析後是dict對象,直接使用Python語法,可以用索引(pillar['pkgs']['apache'])或get方法(pillar.get('users', {}))。詳見下面的例子。
示例
targeting
使用-I選項表示使用Pillar來匹配minion.
salt -I 'role:DB*' test.ping
在Pillar中使用列表
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 %}
利用Pillar處理平臺差異
不同的操作系統不僅管理資源的方式不同,軟件包的名字、配置文件的路徑也有有可能不壹樣。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') }}