如何使用Salt Pillar

做者言

Salt的網站上有兩篇關於Pillar的文檔(),其中一篇內容不多,我以爲寫成一篇文章更合適。本文的邏輯結構沒有參照官方文檔,而是根據我本身對Pillar的理解組織內容,但願可以把這個概念解釋清楚。文中的示例代碼來自官方文檔。html

我只是SaltStack的初學者,若是文中有錯誤的地方,請不吝賜教。 在學習的過程,我作了一些實驗,犯了很多錯,積累了一些經驗,對SaltStack的運行也有必定了解,若是有什麼問題,或是不太理解的地方,很是歡迎留言交流!git

Pillar是什麼?

Pillar是Salt很是重要的一個組件,它用於給特定的minion定義任何你須要的數據,這些數據能夠被Salt的其餘組件使用。Salt在0.9.8版本中引入了Pillar。Pillar在解析完成後,是一個嵌套的dict結構;最上層的key是minion ID,其value是該minion所擁有的Pillar數據;每個value也都是key/value。apache

這裏能夠看出Pillar的一個特色,Pillar數據是與特定minion關聯的,也就是說每個minion都只能看到本身的數據,因此Pillar能夠用來傳遞敏感數據(在Salt的設計中,Pillar使用獨立的加密session,也是爲了保證敏感數據的安全性)。vim

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定義的目錄下。示例以下:session

pillar_roots:
  base:
    - /srv/pillar

這段代碼定義了base環境下的Pillar文件保存在/srv/pillar/目錄下。與State類似,Pillar也有top file,也使用相同的匹配方式將數據應用到minion上。示例以下:
/srv/pillar/top.sls:ssh

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要用冒號加空格分隔,沒有空格的話將解析失敗。ui

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') }}
相關文章
相關標籤/搜索