pillar也是salt最重要的組件之一,其作用是定義與被控主機相關的任何數據,定義好的數據可以被其他組件使用,如模板、state、API等。在pillar中定義的數據與不同業務特征的被控主機相關聯,這樣不同被控主機只能看到自己匹配的數據,因此pillar安全性很高,適用於一些比較敏感的數據,這也是區別於grains最關鍵的一點,如定義不同業務組主機的用戶id、組id、讀寫權限、程序包等信息,定義的規范是采用Python字典形式,即鍵/值,最上層的鍵一般為主機的id或組名稱。
pillar的定義:
1、主配置文件定義
salt默認將主控端配置文件中的所有數據都定義到pillar中,而且對所有被控主機開放,可通過修改/etc/salt/master配置中的pillar_opts: True或False來定義是否開戶或禁用這項功能,修改后執行salt '*' pillar.data來觀察效果。
2、SLS文件定義
pillar支持在slsy文件中定義數據,格式須符合YAML規范,與salt和state組件十分相似,兩者文件的配置格式、入口文件top.sls都是一致的。
(1)定義pillar的主目錄
修改主配置文件/etc/salt/master的pillar_roots參數,定義pillar的主目錄
同時創建pillar目錄,執行命令: install -d /srv/pillar
(2)定義入口文件top.sls
入口文件的作用一般是定義pillar的數據覆蓋被控主機的有效域范圍,"*" 代表任意主機,其中包括了一個data.sls文件,
/srv/pillar/top.sls
base:
'*':
- data
/srv/pillar/data.sls
appname: website
flow:
maxconn: 30000
maxmem: 6G
(3)校驗pillar
通過 salt 'myhost' pillar.data appname flow 命令可以看到多出了上面定義的 data.sls數據項。如果結果不符合預期,可以嘗試刷新被控機pillar數據,
運行 salt 'myhost' saltutil.refresh_pillar 即可刷新
3、pillar的使用
完成pillar配置后,接下來我們可以在state、模板文件中引用,模板格式為 "{{ pillar變量 }}" ,例如:
{{ pillar['appname'] }} (一級字典)
{{ pillar['flow']['maxconn'] }} (二級字典) 或 {{ salt['pillar.get']('flow: maxconn'),{} }}
Python API格式如下:
pillar['flow']['maxconn']
pillar.get('flow:appname',{})
結合grains處理數據的差異性----示例:
3.1 創建pillar目錄和top.sls文件
1
2
3
4
5
|
# mkdir /srv/pillar
# vi /srv/pillar/top.sls
base:
'*'
:
- ip
|
3.2 先通過pillar獲取minion主機IP
1
2
|
# vi /srv/pillar/ip.sls
ip: {{ grains[
'ipv4'
][1] }}
|
#寫完后,執行sls命令,可以看到已經獲取到IP
1
2
3
4
5
6
7
8
9
|
# salt '*' pillar.item ip
host2:
----------
ip:
192.168.18.213
host1:
----------
ip:
192.168.18.212
|
既然grains與pillar類似,就說下區別:
1.grains是minion每次加載時獲取本地系統信息數據,是靜態的,固定的,而pillar是動態加載數據,隨時變化的,比grains更靈活。
2.grains數據存儲在minion本地,pillar存儲在master
jinja2官網語法介紹: http://jinja.pocoo.org/docs/dev/templates/