天天看點

saltstack使用指南:saltstack元件之state狀态管理

saltstack之state狀态管理

1. 狀态的概念及如何撰寫一條狀态
2. 狀态配置檔案的各個要素
3. 使用requisites對狀态進行排序控制
           

一、狀态的概念及如何撰寫一條狀态

遠端執行子產品的過程類似于一段shell腳本或python腳本,每次執行都會觸發相同的功能。在大量minion運作遠端指令非常重要,但是對minion的環境控制,建議還是用狀态進行管理更為友好。

狀态是對minion的一種描述和定義,管理人員不需要關系任務是如何完成的,隻需要關心minion需要達到怎樣的一個狀态,具體的執行由salt的負責管理狀态的子產品來完成。

首先我們使用pkg執行子產品來完成httpd服務的部署:
[[email protected] modules]# salt '*' pkg.install "httpd"

那麼,如何使用state子產品來完成httpd的部署呢?

1.修改master的配置檔案,指定base環境路徑,base環境是必須指定的
[[email protected] salt]# vi /etc/salt/master
file_roots:
  base:
    - /srv/salt/base

2. 進階狀态的使用需要在master配置檔案裡面打開state_top: top.sls
[[email protected] salt]# grep -n ^state_top /etc/salt/master 
329:state_top: top.sls

3. 重新開機salt-master服務
[[email protected] salt]# /bin/systemctl restart salt-master.service

4. 建立目錄     
[[email protected] salt]# mkdir -p /srv/salt/base/

5. 在base目錄下建立top.sls檔案,建立web目錄及建立apache.sls檔案
[[email protected] salt]# tree
.
└── base
    ├── top.sls
    └── web
        └── apache.sls


[[email protected] salt]# vi /srv/salt/base/top.sls 
base:
  '*':
    - web.apache

[[email protected] salt]# vi /srv/salt/base/web/apache.sls 
apache-install:         #id,名字自己去,建議形象店
  pkg.installed:        #pkg是狀态子產品,installed是子產品裡面的方法
    - name: httpd       #httpd是方法裡面的參數
apache-service:
  service.running:
    - name: httpd
    - enable: True       #設定開機啟動

6. 執行狀态子產品部署服務,狀态子產品會到base目錄下找到top.sls,檔案編排告訴每個minion需要幹什麼
[[email protected] salt]# salt '*' state.highstate 

[[email protected] base]# salt '*' cmd.run 'ss -tnulp | grep nginx'
izwz9f8xrvty50quc2gq50z:
    tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=21446,fd=6),("nginx",pid=21445,fd=6))
    tcp    LISTEN     0      128      :::80                   :::*                   users:(("nginx",pid=21446,fd=7),("nginx",pid=21445,fd=7))
iZbp150ikdomqe3b32qaubZ:
    tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=21881,fd=6),("nginx",pid=21880,fd=6))
    tcp    LISTEN     0      128      :::80                   :::*                   users:(("nginx",pid=21881,fd=7),("nginx

擴充:state.highstate與satte.sls的差別?
1.state.highstate會讀取所有環境(包括base環境)的top.sls檔案,并且執行top.sls檔案内容裡面定義的sls檔案,不在top.sls檔案裡面記錄的sls則不會被執行;
2.state.sls預設讀取base環境,但是它并不會讀取top.sls檔案。你可以指定state.sls執行哪個sls檔案,隻要這個sls檔案在base環境下存在;
3.state.sls也可以指定讀取哪個環境:state.sls salt_env=’prod’xxxx.sls,這個xxxx.sls可以不在top.sls中記錄。
           

二、狀态配置檔案的各個要素

通過上面的例子,我們了解了狀态的概念,并制作了第一個狀态檔案,下面我們來看下狀态檔案的構成,以上面的apache.sls檔案為例:

[[email protected] salt]# cat apache.sls 
insatll_httpd:
  pkg.installed:
    - name: httpd

注:
1. YAML是一個強大的标記性語言
2. Salt使用一個YAML的小型子集,映射常用的資料結構,如清單和字典
3. YAML renderer是将YAML資料格式的結構變異成python資料結構給salt使用

三個規則:

1. 規則一:縮進

YAML使用了一個固定的縮進風格來表示資料層結構關系。salt需要每個縮進級别由兩個空格組成。不要使用tabs。

2. 規則二:冒号

Python的字典理所當然是簡單的鍵值對,其它語言的使用者應該也知道這個資料類型叫哈希表或者關聯數組。

3. 規則三:短橫杠

用一個短橫杠加一個空格來表示清單項。多個項使用同樣的縮進級别作為同一清單的一部分。
           

三、使用requisites對狀态進行排序控制

這裡,我們用安裝JDK+tomcat的例子來闡述saltstack使用requisites對狀态是如何進行排序控制的?

requisites:中文意思為必要條件,在salt裡面可以了解為依賴某一動作或行為才能出發下一步的操作。使用require可以讓各ID之間産生依賴關系,避免無效執行。

ok,廢話不多講了,直接進入主題,我們用state狀态子產品安裝jdk+tomcat來告訴大家其中的奧妙!

1. 修改master配置檔案,指定base環境路徑,重新開機salt-master服務
[[email protected] ~]# vi /etc/salt/master      
file_roots:
  base:
    - /srv/salt/base
[[email protected] ~]# /bin/systemctl restart salt-master.service

2. 建立目錄
[[email protected] ~]# mkdir /srv/salt/base

3. base目錄結構
[[email protected] ~]# cd /srv/salt/base
[[email protected] base]# tree
├── jdk
│   ├── files
│   │   └── jdk1.7.0_79.tar.gz
│   └── install.sls
├── tomcat
│   ├── files
│   │   ├── apache-tomcat-7.0.88.tar.gz
│   │   └── catalina.sh
│   └── install.sls
└── top.sls


4.建立top.sls檔案
[[email protected] base]# vi top.sls 
base:
  '*':
    - jdk.install            #jdk表示jdk目錄,install表示files目錄下的install.sls檔案
    - tomcat.install         #同理

5.jdk目錄下建立install.sls   
    [[email protected] jdk]# vi install.sls
    jdk-installl:
      file.managed:
        - name: /usr/local/jdk1.7.0_79.tar.gz
        - source: salt://jdk/files/jdk1.7.0_79.tar.gz
        - user: root
        - group: root
        - mode: 755
      cmd.run:
        - name: cd /usr/local/ && tar axf jdk1.7.0_79.tar.gz && mv jdk1.7.0_79 /usr/local/jdk && chown -R root:root /usr/local/jdk
        - unless: test -d /usr/local/jdk      #unless: 判斷是否為false,如果為false則執行cmd.run中的指令
        - requrie:
          - file: jdk-install

    jdk-config:
      file.append:
        - name: /etc/profile
        - text:
          - export JAVA_HOME=/usr/local/jdk
          - export JRE_HOME=$JAVA_HOME/jre
          - export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
          - export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin

6.tomcat目錄下建立install.sls
[[email protected] tomcat]# vi install.sls 
include:
   - jdk.install

tomcat_install:
  file.managed:
    - name: /usr/local/apache-tomcat-7.0.88.tar.gz
    - source: salt://tomcat/files/apache-tomcat-7.0.88.tar.gz
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: cd /usr/local/ && tar axf apache-tomcat-7.0.88.tar.gz && mv apache-tomcat-7.0.88 /usr/local/tomcat && chown -R root:root /usr/local/tomcat
    - unless: test -d /usr/local/tomcat

tomcat-config:
  file.append:
    - name: /etc/profile
    - text:
      - export TOMCAT_HOME=/usr/local/tomcat
      - export PATH=${TOMCAT_HOME}/bin:$PATH

tomcat-catalina.sh:
  file.managed:
    - name: /usr/local/tomcat/bin/catalina.sh
    - user: root
    - mode: 755
    - source: salt://tomcat/files/catalina.sh
    - require:
      - file: tomcat_install

6. 使用state狀态子產品進行部署
[[email protected] base]# salt '*' state.highstate   

注:
1. catalina.sh以及沒有添加到files目錄下的server.xml檔案,使用者都可以自己定義其内容。生産環境中,這兩個檔案可能配置比較複雜,不可能一台台的配置,是以可以提前配置好檔案内容。當然,這隻是其中一種方法,也可以在salt-master端用file子產品發送檔案到用戶端或者用指令也可以,具體操作自己去找答案吧。
2. 子產品之間的依賴關系
    watch: 關注某一事件變化
    watch_in: 被關注自身事件變化
    require: 依賴某一事件發生
    require_in: 被依賴自身事件發生
    unless: 判斷是否為false,如果為false則執行。常用在cmd中name的指令。
    onlyif: 判斷是否為true,如果為true則執行。
3.在批量安裝的時候,建議提前規劃好目錄結構以及子產品之間的依賴關系。