salt實戰系列-state語法學習

本文參考Saltstack SLS文件解讀

前言:state是salt最核心的功能,通過預先制定好的sls文件對minion端進行狀態管理,支持包括程序包pkg、文件file、網絡配置network、系統服務system、系統用戶user等,更多狀態對象點我

SLS(代表SaLt State文件)是Salt State系統的核心。SLS描述了系統的目標狀態,由格式簡單的數據構成。經常被稱作配置管理。Salt默認使用YAML,來表達SLS數據。

1. top.sls

top.sls 是配置管理的入口文件,一切都是從這里開始,在master 主機上,默認存放在/srv/salt/目錄. top.sls 默認從 base 標簽開始解析執行,下一級是操作的目標,可以通過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包換擴展名。
創建 /srv/salt/top.sls
通過正則進行匹配的示例,

base: '*':
  - webserver

通過分組名進行匹配的示例,必須要有 - match: nodegroup

base:
  group1:
    - match: nodegroup
    - webserver

通過grain模塊匹配的示例,必須要有- match: grain

base:
  'os:Fedora':
    - match: grain
    - webserver

準備好top.sls文件后,編寫一個state文件

  • /srv/salt/webserver.sls
apache:            # 標簽定義
  pkg:             # state declaration
    - installed    # function declaration

第一行被稱為(ID declaration) 標簽定義,在這里被定義為安裝包的名。注意:在不同發行版軟件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
第二行被稱為(state declaration)狀態定義, 在這里定義使用(pkg state module)
第三行被稱為(function declaration)函數定義, 在這里定義使用(pkg state module)調用 installed 函數

最后可以在終端中執行命令來查看結果:

salt '*' state.highstate

或附件 test=True參數 測試執行

salt '*' state.highstate -v test=True

主控端對目標主機(targeted minions)發出指令運行state.highstatem模塊,目標主機首先會對top.sls下載,解析,然后按照top.sls內匹配規則內的定義的模塊將被下載,解析,執行,然后結果反饋給 master.

2. SLS文件命名空間

注意在以上的例子中,SLS文件 webserver.sls 被簡稱為webserver. SLS文件命名空間有如下幾條基本的規則:

  • SLS文件的擴展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
  • 子目錄可以更好的組織,每個子目錄都由一個點來表示.(例如 webserver/dev.sls 可以簡稱為 webserver.dev)
  • 如果子目錄創建一個init.sls的文件,引用的時候僅指定該目錄即可. (例如 webserver/init.sls 可以簡稱為 webserver)
  • 如果一個目錄下同時存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 將被忽略,SLS文件引用的webserver將只引用webserver.sls

3 . state多文件示例

下面是一個state多文件示例,

apache/init.sls
apache/httpd.confssh/init.sls
ssh/server.sls
ssh/banner
ssh/ssh_config
ssh/sshd_config

創建一個引用這些目錄的 server.sls

server: 
  - apache
  - ssh

state的層級關系
include 示例:
include 包含某個state文件

  • /srv/salt/apache.sls
apache:
  pkg:
    - installed
  service:
      - running
      - require:
        - pkg: apache

使用 include 可以包換有state文件而不必重新寫

  • /srv/salt/apache-custom.sls
include: apache

extend 示例:
extend 與include配合使用,作用是 修改,或擴展引用的state文件的某個字段

  • /srv/salt/apache.sls
apache:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: apache

extend默認是替換引用文件的某個字段的屬性,如例

  • /srv/salt/apache-change.sls
include:
  - apache

extend:
 apache
   pkg:
     - name: vim
     - installed

當extend與watch,或require結合使用的時候,則是擴展某個字段的屬性,如例:

  • /srv/salt/apache-custom.sls
include:
  - apache

extend:
  apache
    service:
      - watch:
        - file: /etc/redis.conf

4. state的邏輯關系列表及示例

match: 配模某個模塊,比如 match: grain match: nodegroup
require: 依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
watch: 在某個state變化時運行此模塊
order: 優先級比require和watch低,有order指定的state比沒有order指定的優先級高

# state的邏輯關系

  • require:依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
httpd: # maps to "name"
  pkg:
    - installed
  file: # maps to State module filename
    - managed: # maps to the managed function in the file State module
    - name: /etc/httpd/conf/httpd.conf # one of many options passed to the manage function
    - source: salt://httpd/httpd.conf
    - require:
      - pkg: httpd
  • watch:在某個state變化時運行此模塊,watch除具備require功能外,還增了關注狀態的功能。
redis:
  pkg:
    - latest
  file.managed:
    - source: salt://redis/redis.conf
    - name: /etc/redis.conf
    - require:
      - pkg: redis
  service.running:
    - enable: True
    - watch:
      - file: /etc/redis.conf
      - pkg: redis
  • order:優先級比require和watch低,有order指定的state比沒有order指定的優先級高
vim:
  pkg.installed:
    - order: 1

# 想讓某個state最后一個運行,可以用last

5. 進階主題:模板

使用模板來精簡SLS,使SLS可以使用python的 循環,分支,判斷 等邏輯

{% for item in ['tmp','test'] %}
/opt/{{ item }}:
  file.directory:
    - user: root
    - group: root
    - mode: 755
    - makedirs: True
{% endfor %}
httpd:
  pkg.managed:
  {% if grains['os'] == 'Ubuntu' %}
     - name: apache2
  {% elif grains['os'] == 'CentOS' %}
     - name: httpd
  {% endif %}
     - installed

通過加載jinja模板引擎,可以模板配置文件按照預訂條件來生成最終的配置文件

  • /opt/test.conf
{% if grains['os'] == 'Ubuntu' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}
/opt/test.conf:
  file.managed:
    - source: salt://test.conf 
    - user: root 
    - group: root 
    - mode: 644 
    - template: jinja

參考文檔
文檔: http://docs.saltstack.com/topics/tutorials/starting_states.html
文檔: http://docs.saltstack.com/ref/states/writing.html
文檔: http://docs.saltstack.com/ref/states/ordering.html
文檔: http://www.ituring.com.cn/article/37783
文檔: http://docs.saltstack.com/topics/tutorials/starting_states.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 更多關注:http://www.mknight.cn/ 安裝 啟動 基本命令 salt-key salt-key命...
    Medivh_閱讀 1,120評論 0 0
  • 學習地址[http://tech.mainwise.cn/?p=438] 更新于 3.25 23:16 salt簡...
    J書越來越垃圾了閱讀 30,912評論 9 36
  • saltstack之SLS文件 簡述 SLS(代表SaLt State文件)是Salt State系統的核心。SL...
    很少更新了閱讀 10,473評論 1 2
  • 關于,SaltStack 這個牛逼的配置管理神器,上周我寫了篇入門級的 《SaltStack 一日游》。 今天,深...
    hxzqlh閱讀 2,532評論 0 1
  • 我在學校里的體育課上,拍籃球拍了199個,下課邱老師獎勵我敲了5顆章,今天羽毛球課放假,去了晚托班過生日會,有4個...
    悠記閱讀 306評論 0 1