一,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就介紹到這里。