天天看點

SaltStack Pillar 詳解

簡介  

  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 資料      
SaltStack Pillar 詳解
SaltStack Pillar 詳解
# 資料格式,類似于字典    
        foo:
        bar:
            baz:qux
# 擷取方式:
    {{ pillar['foo']['bar']['baz']}}
    {{ salt['pillar.get']('foo:bar:baz', 'qux')}}              

pillar.get

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 
SaltStack Pillar 詳解
SaltStack Pillar 詳解
(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 的輸出結果

關于pillar的 sls 檔案使用說明:

  預設的入口檔案為/src/pillar/top.sls

  top.sls的引用方式分為兩種:

  • 将引用sls檔案放在同級目錄
  • 在/src/pillar/ 目錄下建立對應的packages, services目錄,并在該目錄下建立init.sls檔案。

備注:如果要引用執行的sls檔案和目錄同時存在,也就是方法一和方法二都存在,packages.sls和packages/init.sls,會優先使用packages.sls檔案。

SaltStack Pillar 詳解
SaltStack Pillar 詳解
(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引用說明

配置好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'] }}')      

繼續閱讀