Saltstack SLS文件解讀

SLS文件

簡述

SLS(表明SaLt State文件)是Salt State系統的核心。SLS描述了系統的目標狀態,由格式簡單的數據構成。這常常被稱做配置管理html

top.sls

top.sls 是配置管理的入口文件,一切都是從這裏開始,在master 主機上,默認存放在/srv/salt/目錄. top.sls 默認從 base 標籤開始解析執行,下一級是操做的目標,能夠經過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包換擴展名。node

建立 /srv/salt/top.slspython

  • 經過正則進行匹配的示例,
base:
  '*':
    - webserver
  • 經過分組名進行匹配的示例,必需要有 - match: nodegroup
base:
  group1:
    - match: nodegroup    
    - webserver
  • 經過grain模塊匹配的示例,必需要有- match: grain
base:
  'os:Fedora':
    - match: grain
    - webserver

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

  • /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 函數

最後能夠在終端中執行命令來查看結果:redis

salt '*' state.highstate

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

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

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

SLS文件命名空間

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

  1. SLS文件的擴展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
  2. 子目錄能夠更好的組織,每一個子目錄都由一個點來表示.(例如 webserver/dev.sls 能夠簡稱爲 webserver.dev)
  3. 若是子目錄建立一個init.sls的文件,引用的時候僅指定該目錄便可. (例如 webserver/init.sls 能夠簡稱爲 webserver)
  4. 若是一個目錄下同時存在webserver.sls 和 webserver/init.sls,那麼 webserver/init.sls 將被忽略,SLS文件引用的webserver將只引用webserver.sls

state多文件示例

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

apache/init.sls
apache/httpd.conf
ssh/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

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

進階主題:模板

使用模板來精簡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

參考文檔

相關文章
相關標籤/搜索