簡介
grains用於存儲靜態不易變更的數據,而pillar一般用於存儲動態, 敏感的數據,通過minion和master設置或獲取grains信息,而pillar信息只能在master端配置,在到minion端執行。pillar 默認使用sls文件進行數據存儲(YAML格式),除此之外, pillar也同事支持多種后端的數據存儲方式,例如:mysql,mongodb,ldap,json,cobbler甚至是puppet。
常用的場景:
1. 敏感數據:例如ssh key,加密整數等,由於Pillar使用獨立的加密session,可以確保這些敏感數據不被其他minion看到。
2. 不同變量:可以再pillar中處理平台差異性,比如針對不同的操作系統設置軟件包的名字,然后在state中引用。
3. 用戶版本等變量:可以在pillar中添加任何需要用到的數據,比如定義用戶和UID的對應關系,軟件版本和端口,minion的角色等等
基礎內容:
- 默認目錄: /srv/pillar/, 在master配置文件中指定,目錄默認需要自己創建。修改配置文件可修改。
- 入口文件: /srv/pillar/top.sls , pillar默認的主入口配置文件。
- Pillar默認值:與grains不同,所有的pillar值都是人為設定的,默認pillar為空。
- sls 文件:pillar的文件,sls是saltstack的縮寫,YAML風格,支持jinja模板。
常用命令:
salt '*' sys.doc pillar # 查看與pillar有關的幫助信息 salt '*' pillar.items # 獲取所有pillar items值 salt '*' pillar.data # 等價於pillar.items salt '*' saltutil.refresh_pillar # 刷新pillar值 salt '*' saltutil.sync_all # 刷新pillar值,與refresh_pillar操作類似,但范圍更大 salt '*' sys.list_functions pillar # 列出所有的pillar相關函數方法 salt '*' pillar.get xxx # 獲取某項的值,類似於python字典的get函數 salt '*' pillar.raw # 內存中獲取 salt '*' state.highstate pillar={'test': 'abc'} # 在命令設置pillar 數據

# 數據格式,類似於字典 foo: bar: baz:qux # 獲取方式: {{ pillar['foo']['bar']['baz']}} {{ salt['pillar.get']('foo:bar:baz', 'qux')}}
Master配置文件中關於pillar的相關信息
(1)pillar目錄 pillar_roots: base: - /srv/pillar (2)是否將master配置文件中的數據信息添加到pillar中,默認是不加,需要的話可以改成True,重啟服務生效。 pillar_opts: False (3)pillar 源,salt支持引入pillar外部資源,例如從數據庫導入pillar值,默認是關閉的 ext_pillar_first: False
(4)開啟pillar gitgs ssl驗證
pillar_gitfs_ssl_verify: True
(5)開啟pillar render 錯誤信息
pillar_safe_render_error: True
(6)設置pillar配置合並策略
pillar_source_merging_strategy: smart
Pillar的刷新方式:
- salt '*' saltutil.refresh_pillar
- salt '*' saltutil.sync_all

(1) salt '*' saltutil.refresh_pillar [root@saltmaster pillar]# salt '*' saltutil.refresh_pillar saltmaster: True (2) salt '*' saltutil.sync_all [root@saltmaster pillar]# salt '*' saltutil.sync_all saltmaster: ---------- beacons: clouds: engines: grains: log_handlers: modules: output: proxymodules: renderers: returners: sdb: states: utils:
關於pillar的 sls 文件使用說明:
默認的入口文件為/src/pillar/top.sls
top.sls的引用方式分為兩種:
- 將引用sls文件放在同級目錄
- 在/src/pillar/ 目錄下創建對應的packages, services目錄,並在該目錄下創建init.sls文件。
備注:如果要引用執行的sls文件和目錄同時存在,也就是方法一和方法二都存在,packages.sls和packages/init.sls,會優先使用packages.sls文件。

(1)方式一: [root@saltmaster srv]# tree /srv/pillar/ /srv/pillar/ # 默認pillar文件目錄 ├── packages.sls # packages 引用文件 ├── services.sls # services 引用文件 └── top.sls # 固定的入口文件top.sls (2)方式二: [root@saltmaster srv]# tree /srv/pillar/ /srv/pillar/ ├── packages # packages 目錄 │ └── init.sls # 引用文件 ├── services # services 目錄 │ └── init.sls # 引用文件 └── top.sls # 固定的入口文件top.sls # 引入文件說明 [root@saltmaster pillar]# cat packages.sls zabbix: package-name: zabbix version: 2.2.4 [root@saltmaster pillar]# cat services.sls zabbix: port: 10050 user: admin
配置好top.sls以及附屬sls文件后,可以刷新一下pillar,查看各個pillar值
[root@saltmaster pillar]# salt '*' pillar.items saltmaster: ---------- zabbix: ---------- package-name: zabbix port: 10050 user: admin version: 2.2.4
pillar 中jinja模板的使用
通過jinja模板來寫 sls 文件,然后通過操作系統的不同利用grains 獲取 pillar 信息。同樣在state組件里也可以更方便的調用pillar。
[root@saltmaster pillar]# cat top.sls base: '*': - packages [root@saltmaster pillar]# cat packages.sls pkgs: # 模塊名稱 {% if grains['os'] == 'CentOS' %} # 使用jinja模板,通過grains篩選主機 apache: httpd # 安裝包名稱 git: git {% elif grains['os'] == 'SUSE' %} apache: apache2 git: git-core {% endif %} [root@saltmaster pillar]# salt '*' saltutil.refresh_pillar [root@saltmaster pillar]# salt "*" pillar.items saltmaster: ---------- pkgs: ---------- apache: httpd git: git salt-minion-1: ---------- pkgs: ---------- apache: apache2 git: git-core
pillar 對敏感數據密碼信息的存儲
# cat /srv/pillar/database.sls dbname: project dbuser: username dbpass: password dbhost: localhost # 在模塊文件中引用方式: # cat website.conf # MySQL setttings define('DB_NAME', '{{ pillar['dbname'] }}') # MySQL database username define('DB_USER', '{{ pillar['dbuser'] }}') # MySQL database password define('DB_PASSWORD', '{{ pillar['dbpass'] }}') # MySQL hostname define('DB_HOST', '{{ pillar['dbhost'] }}')