Salt-Formulas的使用

Saltstack自0.17.x版本開始引進Formulas的概念,旨在經過簡化State和集成數據來實現State的友好管理。根據SALT FORMULAS的官方文檔,在完成手動添加formula目錄後,formula應該提供一些默認的配置而當即可用。若是須要進一步的配置,大部分的formulas能夠經過Pillar數據進行配置,能夠參考每一個Formula倉庫的pillar.example文件查詢可用的配置。html

1、未集成的State

先來看下編寫State的通常樣例:apache

 

  1. apache:
  2. pkg:
  3. - installed
  4. {% if grains['os_family'] == 'RedHat' %}
  5. - name: httpd
  6. {% elif grains['os_family'] == 'Debian' %}
  7. - name: apache2
  8. {% endif %}

乍看一下以爲這樣寫很正常,但是仔細想一想吧,這樣一來,apache的應用屬性的判斷邏輯寫死在sls文件裏,一旦須要更多的判斷邏輯時這樣的寫法便稍顯笨拙,那麼,有什麼好辦法呢?spa

2、引進 Formulas

其實簡單來講的話,Formulas便是建議使用Salt的用戶編寫State sls時統一使用map.jinjia來完成處理邏輯和判斷,從而生成相似pillar的變量數據。下面,一樣以apache爲例講述Salt Formulas編寫邏輯。Formulas結構以下:rest

 

  1. .
  2. ├── /srv/salt/apache/conf.sls
  3. ├── /srv/salt/apache/init.sls
  4. └── /srv/salt/apache/map.jinja

Formulas的核心便在於map.jinja的編寫,如上Apache對應的map.jinja樣例內容以下:orm

 

  1. {% set apache = salt[‘grains.filter_by’]({
  2. Debian’: {
  3. server’: apache2’,
  4. service’: apache2’,
  5. conf’: ‘/etc/apache2/apache.conf’,
  6. },
  7. RedHat’: {
  8. server’: httpd’,
  9. service’: httpd’,
  10. conf’: ‘/etc/httpd/httpd.conf’,
  11. },
  12. }, merge=salt[‘pillar.get’](‘apache:lookup’)) %}

這樣一來,apache對應的主sls(init.sls)內容則能夠改寫爲以下:server

 

  1. {% from apache/map.jinja import apache with context %}
  2. apache:
  3. pkg:
  4. - installed
  5. - name: {{ apache.server }}
  6. service:
  7. - running
  8. - name: {{ apache.service }}
  9. - enable: True

少了複雜的判斷邏輯,多了變量數據的簡單使用!htm

3、結合Pillar的Formulas

Salt Formulas 還能夠經過結合Pillar實現更多的擴展。一樣以上述Apache的配置爲例,須要編寫conf.sls來完成apache的配置,結合Formulas Map 概念以後,它可能變成以下內容:blog

salt-formulas-pillar

注意上述配置裏,除了導入map.jinja預約義內容外,還有一行source配置使用了奇怪的salt["pillar.get"]["apache:lookup:config:tmpl"],熟悉pillar的應該不陌生,這即是結合了pillar來完成state的定義。文檔

事先在/srv/pillar/top.sls裏包含apache.sls,然後在這個pillar定義文件裏添加對應內容來重寫映射關係:get

 

  1. apache:
  2. lookup:
  3. config:
  4. tmpl: salt://apache/files/redhat/
  5. server: my_custom_apache

這樣一來,即可以基於Formulas map基礎上作更多的特點化配置。

4、Salt Formulas 製做

如你所見,Formulas其實應該算是State的集成和封裝,事實上,Github也已經有不少的*-Formulas state出現,一個標準的*-Formulas 擁有如下結構:

 

  1. foo-formula
  2. |-- foo/
  3. | |-- map.jinja
  4. | |-- init.sls
  5. | `-- bar.sls
  6. |-- CHANGELOG.rst
  7. |-- LICENSE
  8. |-- pillar.example
  9. |-- README.rst
  10. `-- VERSION

具體可參照Github上已有的Formulas樣例,這裏再也不贅述。

參考內容:

salt官網

Forrest Alvarez Demo

相關文章
相關標籤/搜索