Salt Pillar
作者言
Salt的網站上有兩篇關於Pillar的文件( , ),其中一篇內容很少,我覺得寫成一篇文章更合適。本文的邏輯結構沒有參照官方文件,而是根據我自己對Pillar的理解組織內容,希望能夠把這個概念解釋清楚。文中的示例程式碼來自官方文件。
我只是SaltStack的初學者,如果文中有錯誤的地方,請不吝賜教。 在學習的過程,我做了一些實驗,犯了不少錯,積累了一些經驗,對SaltStack的執行也有一定了解,如果有什麼問題,或是不太理解的地方,非常歡迎留言交流!
Pillar是什麼?
Pillar是Salt非常重要的一個元件,它用於給特定的minion定義任何你需要的資料,這些資料可以被Salt的其他元件使用。Salt在0.9.8版本中引入了Pillar。Pillar在解析完成後,是一個巢狀的dict結構;最上層的key是minion ID,其value是該minion所擁有的Pillar資料;每一個value也都是key/value。
這裡可以看出Pillar的一個特點,Pillar資料是與特定minion關聯的,也就是說每一個minion都只能看到自己的資料,所以Pillar可以用來傳遞敏感資料(在Salt的設計中,Pillar使用獨立的加密session,也是為了保證敏感資料的安全性)。
Pillar可以用在哪些地方?
-
敏感資料
例如ssh key,加密證照等,由於Pillar使用獨立的加密session,可以確保這些敏感資料不被其他minion看到。 -
變數
可以在Pillar中處理平臺差異性,比如針對不同的作業系統設定軟體包的名字,然後在State中引用。 -
其他任何資料
可以在Pillar中新增任何需要用到的資料。比如定義使用者和UID的對應關係,mnion的角色等。 -
用在Targetting中
Pillar可以用來選擇minion,使用-I
選項。
怎樣定義Pillar資料?
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') }}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2653721/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Saltstack系列5:Saltstack之pillar元件元件
- 撒點鹽Salt
- salt-master命令詳解AST
- salt-minion離線安裝
- Salt Highstate資料結構定義資料結構
- php password_hash password_verify 加密驗證不需要saltPHP加密
- 將 Laravel 使用者密碼加密方式修改為 md5+salt 方式Laravel密碼加密
- shiro入門學習--使用MD5和salt進行加密|練氣後期加密
- PostgreSQL使用者密碼如何透過md5加密儲存,是否加了saltSQL密碼加密
- 《Sea Salt》:充斥血腥暴力的畫素遊戲,演繹反英雄式的克蘇魯神話遊戲
- SpringBoot整合Shiro+MD5+Salt+Redis實現認證和動態許可權管理(上)----築基中期Spring BootRedis
- SpringBoot整合Shiro+MD5+Salt+Redis實現認證和動態許可權管理|前後端分離(下)----築基後期Spring BootRedis後端
- 在密碼學中,“加鹽”(Salting)是指在儲存使用者密碼的雜湊值之前,向原始密碼新增一個隨機生成的字串(稱為“鹽”Salt)的過程。密碼學隨機字串