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.在批量安裝的時候,建議提前規劃好目錄結構以及子產品之間的依賴關系。