集中化管理平臺saltstack--state(5)

state

state是Saltstack最核心的功能,通過預先定製好的sls(salt state file)文件對被控制主機進行狀態管理,支持包括程序包(pkg)、文件(file)、網絡配置(network)、系統服務(service)、系統用戶(user)等。

state的定義

state的定義是通過sls文件進行描述的,支持YAML語法,定義規則如下:

$ID: #定義state名稱,通常採用與描述對象保存一致的方法,如apache、nginx等 
  $state: #須管理對象的類型
    - $state: states #定製對象的狀態

官網示例如下:

apache:                    
  pkg:                    
    - installed                
  service:                  
    - running                
    - require:                 
      - pkg: apache

注:

require:在運行此state之前,先運行依賴的state關係檢查,可配置多個state依賴對象;
watch:在檢查摸個state發生變化時運行此模塊。


state的使用

state的入口文件與pillar一樣,文件名都是top.sls,區別在於state要求sls文件必須存放在Saltstack base定義的目錄下(默認爲/srv/salt)。

state描述配置 *.sls支持:

    jinjia模板:

    指定分發到minion端的file文件中使用jinjia,通過使用template指令指定類型來區分是模板還是普通文件資源。

如:     file.managed

          - name: /……         #對不同的服務,指定存放至minion端的配置文件路徑

          - source: salt://……    #發送給minion端的配置文件在master端的位置,salt:// 是指從salt的文件根目錄開始。

         - user: root          #指定推送至minion端後的文件屬主  

          - group: root         #指定推送至minion端後的文件屬組 

          - mode: 644           #指定推送至minion端後的文件權限

          - template:jinja        #指定文件中的jinja參數根據客戶端條件自動生成相應的值。  

           ……

    grains及pillar引用

        變量使用Grains:{{ grains['fqdn_ip4'] }}

        變量使用執行模塊:{{ salt['network.hw_addr']('eth0') }}

        變量使用Pillar:{{ pillar['apache']['PORT'] }}

    在state的邏輯層次定義完成後,再通過salt '*' state.highstate執行生效。

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

首先,在master上面定義salt的主目錄,vim /etc/salt/master:

例1:

結合grains與pillar,實現一個根據不同操作系統類型部署apache環境的任務

定義pillar

【/srv/pillar/top.sls】

base:
  '*':
      - apache

在top.sls中引用二級配置有兩種方式,一種是直接引用,如本例中直接引用apache.sls;另一種是創建apache目錄,再引用目錄中的init.sls文件,兩者效果是一樣的。


即【/srv/pillar/apache.sls】或【/srv/pillar/apache/init.sls】

pkgs:
{% if grains['os_family'] == 'Debian' %}
  apache: apache2
  {% elif grains['os_family'] == 'RedHat' %}
  apache: httpd
  {% elif grains['os'] == 'Arch' %}
  apache: apache
{% endif %}

測試:

salt '*' saltutil.refresh_pillar    
salt '*' pillar.data pkgs

測試看輸出的Apache是否正確。


定義state

【/srv/salt/top.sls】

base:
  '*':
    - apache

 

編寫完top.sls後,編寫state.sls文件;

【/srv/salt/apache.sls】或【/srv/salt/apache/init.sls】

apache:
 pkg:
     - installed
     - name: {{ pillar['pkgs']['apache'] }}   #pillar['pkgs']['apache']引用的是pillar定義的數據
 service.running:
     - name: {{ pillar['pkgs']['apache'] }}
     - require:                                 #確保Apache服務只有在成功安裝軟件包後纔會啓動
        - pkg: {{ pillar['pkgs']['apache'] }}

執行state

默認匹配所有的state.sls模塊,並推送。

salt '*' state.highstate

結果:

wKiom1i1DQGCQ9C1AACUkLkk_oU310.png-wh_50


————————————————————————————————————————————

例2:

top.sls 默認從 base 標籤開始解析執行,下一級是操作的目標,可以通過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件。

首先在salt配置文件 /etc/salt/master 中定義

 nodegroups:

    my_app: 'L@主機名,主機名……'

注:L@表示後面的主機id格式爲列表

   G@表示以grain格式描述

   S@表示以IP子網或地址格式描述

top.sls內容如下:

base:
   my_app:             
        - match: nodegroup
        - nginx

  'os:Redhat':            
        - match: grain
        - nginx

編寫完top.sls後,編寫state.sls文件;

即【/srv/salt/nginx.sls】或【/srv/salt/nginx/init.sls】

nginx:
  pkg:                      
    - installed             
  service.running:          
    - enable: True          
    - reload: True          
    - require:              
      - file: /etc/init.d/nginx
    - watch:                 
      - file: /etc/nginx/nginx.conf
      - file: /etc/nginx/fastcgi.conf
      - pkg: nginx
/etc/nginx/nginx.conf:       
  file.managed:              
    - source: salt://files/nginx/nginx.conf   
    - user: root
    - mode: 644
    - template: jinja        
    - require:
      - pkg: nginx

/etc/nginx/fastcgi.conf:
  file.managed:
    - source: salt://files/nginx/fastcgi.conf 
    - user: root
    - mode: 644
    - require:
      - pkg: nginx

在這個例子中, /etc/nginx/裏的文件並不會被placed(managed),直到nginx軟件包已安裝

在salt的主目錄下的files/nginx/fastcgi.conf和files/nginx/nginx.conf文件,裏面內容就是Nginx的配置文件的內容。

測試:

把Nginx網minion上面推送,並測試安裝:

 salt '*' state.sls nginx test=True
 ……輸出信息略……


————————————————————————————————————————————


state的邏輯關係列表:

    include: 包含某個文件

include:
  - nginx
  - php

    match: 配模某個模塊


    require:在運行此state之前,先運行依賴的state關係檢查,可配置多個state依賴對象;
- require:
  - pkg: nginx

    watch: 在某個state變化時運行此模塊,文中的配置,相關文件變化後,立即執行相應操作

- watch:
  - file: /etc/nginx/nginx.conf
  - file: /etc/nginx/fastcgi.conf
  - pkg: nginx

    order: 優先級比require和watch低,有order指定的state比沒有order指定的優先級高,假如一個state模塊內安裝多個服務,或者其他依賴關係,可以使用

nginx:
  pkg.installed:
    - order:1


參考資料:Python自動化運維

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章