Salt Pillar

張衝andy發表於2019-08-14

作者言

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/,如需轉載,請註明出處,否則將追究法律責任。