saltstack(五) saltstack的state狀態管理


一,YAML語法

  首先先了解一下YAML,默認的SLS文件的renderer是YAML renderer。YAML是一個有很多強大特性的標記性語言。Salt使用了一個YAML的小型子集,映射非常常用的數據結構,像列表和字典。YAML renderer的工作是將YAML數據格式的結構編譯成為Python數據結構給Salt使用。

  YAML語法有三個注意事項,具體如下:

  1,使用空白字符為文件縮排表示結構,不過不能使用TAB

  2,注釋用#號

  3,字符串平常不使用引號,如果有需要,可以使用單引號或雙引號。使用雙引號表示字符串時,特殊字符可以通過倒斜線(\)來進行定義

具體用法

 1,列表:短杠(-)+ 空白字符
        - henry
        - sina
        等價於:['henry','sina']
2,字典:key和value通過冒號(:)+空白字符隔開 name: henry site: http://www.saltstack.cn/ 等價於:{'name':'henry','site':'http://www.saltstack.cn/'} 3,多層結構:通過縮進來表示層級 - henry: - sites: - blog: http://www.saltstack.cn/ 等價於:[{'henry':[{'sites':[{'blog':'http://www.saltstack.cn/'}]}]}]

官網地址:http://docs.saltstack.cn/topics/yaml/index.html

二,jinja

  Salt默認使用Jinja2模板系統來生成YAML,是python語言開發的一個模板引擎,類似於Djingo模板系統

jinja模塊的用法:

 1 變量:{{ foo }},變量如果是字典的話可以使用{{foo.bar}}或{{foo['bar']}}      
 2 注釋:{# comment #}
 3 for:                          ##可以使用for循環取值
 4   {% for eachitem in items %}
 5     {{ eachitem }}
 6   {% endfor %}
 7 if:                           ##可以做if條件判斷
 8   {% if GFW %}
 9     welcome to China!
10   {% elif not Internet %}
11     welcome to North korea!
12   {% else %}
13     Freedom
14   {% endif %}

三,State Tree

  Top file:配置管理入口文件,和pillar類似,指定minions需要完成那些配置管理,默認為top.sls
  注:在定義top.sls時,會先找apache/init.sls,如果沒有的話,會找apache.sls
  base:
    '*':
      - apache
  sls模塊使用點(.)來分割,如apache.install等於salt://apache/install.sls或salt://apache/install/init.sls
  Include/Extend:sls文件間可以通過include及extend來引用和擴展
  sls中ID必須唯一,且在該ID下的同一類的狀態管理模塊只能有一個,所謂的slsID 就是定義sls文件時最開始定義在開頭的名字。
  0.17.0 salt增加了state_auto_order參數(默認值為True),使state在沒有Requisites的情況下按照從上而下的順序進行執行

四,Requisites(相當於sls流程控制,那個先執行,那個后執行等) 

  require:本state執行時需要先執行那些state
  require_in:與require位置相反
  watch:除了require外,也會監測依賴的state的狀態,如果狀態發生變化,做出反應(例如監控文件變化,發生變化后立即重啟服務)
  watch_in: 與watch位置相反
  prereq:0.16.0 新增的功能,會通過test=True接口檢查所依賴的state的狀態,如果狀態發生變化,執行
  prereq_in:相反

五,下面介紹三個模塊的用法,更多模塊用法請參考官網

 官網地址:https://docs.saltstack.com/en/latest/ref/states/all/

 軟件包狀態管理模塊
 模塊名:pkg
 功能:管理軟件包狀態,會根據操作系統不同,選擇對應安裝方式
 基本操作:

pkg.installed:     #確保軟件包已安裝,如果沒有安裝進行安裝
pkg.latest:        #確保軟件包是最新版本,如果不是,進行升級
pkg.remove:        #確保軟件包已卸載,如果之前已安裝,進行卸載
pkg.purge:         #除remove外,也會刪除其配置文件

 文件狀態管理模塊:
  模塊名:file
  功能:管理文件狀態
  基本用法:

file.managed:     #保證文件存在並且為對應的狀態
file.recurse:      #保證目錄存在並且為對應的狀態
file.absent:       #確保文件不存在,如果存在則進行刪除操作

  服務狀態管理模塊:
  模塊名:service
  功能: 管理服務狀態
  基本用法:

service.running        #確保服務處於運行狀態
service.enabled        #確保服務會開機自動啟動
service.disabled    #確保服務不會開機自啟動
service.dead        #確保服務當前沒有運行

六,實例操作

    (一)、安裝apache

 

top.sls
    base:
      '*':
        - apache
init.sls
    
apache:                    ##slsID
  pkg.installed:                        ##安裝httpd
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf  ##拷貝/srv/salt/apache/httpd.conf到minion的/etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:                      ##檢查apache有沒有安裝成功
      - pkg: apache            
  service.running:
    - enable: True
    - name: httpd
    - watch:                       ##watch檢測配置文件,如果發生變化會重啟服務
      - pkg: apache
      - file: apache                    

 

運行配置管理:salt '*' state.sls apache
salt '*' salt.highstate test=True #test=True用於測試語法

   (二)、apache需要監控8080端口,代碼如下:

首先修改apache的主配置文件,修改配置文件為 listen {{ port }},修改完成后可以直接在sls文件里定義
apache:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:
      - pkg: apache
    - template: jinja        ##調用jinja模板渲染
    - context:              ##這里可以是context或default效果一樣
      port: 8080
  service.running:
    - enable: True
    - name: httpd
    - watch:
      - pkg: apache
      - file: apache
如果多台主機監聽的端口不一樣,具體修改如下:
    apache:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
    - require:
      - pkg: apache
    - template: jinja
    - defaults:
      {% if grains.id == "10.13.41.80" %}
        port: 8080
      {% elif grais.id == "10.13.41.81" %}
        port: 8081
      {% else %}
        port: 80
      {% endif %}
  service.running:
    - enable: True
    - name: httpd
    - watch:
      - pkg: apache
      - file: apache

為了讓sls文件不參雜業務數據,業務數據應該獨立存放,到了該pillar登台的時候了。

/srv/pillar/apache/init.sls
apache:    
  {% if grains.id == "test" %}
     port: 8081
  {% elif grains.id == "test1" %}
     port: 8082
  {% else %}
     port: 80
  {% endif %}
/srv/pillar/top.sls base: '*': - apache salt '*' saltutil.regresh_pillar ##刷新pillar salt '*' pillar.get apache:port ##取minion的pillar信息 /srv/salt/apache/deploy.sls
- template: jinja
- defaults:
port:{{salt['pillar.get']('apaceh:port',80)}}

saltstack的狀態管理state就介紹到這里。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM