state功能
state是Saltstack最核心的功能,通過預先定制好的sls(salt state file)文件對被控制主機進行狀態管理,支持包括程序包(pkg)、文件(file)、網絡配置(network)、系統服務(service)、系統用戶(user)等。
state的定義
state的定義是通過sls文件進行描述的,支持YAML語法,定義規則如下:
$ID: #定義state名稱,通常采用與描述對象保存一致的方法,如apache、nginx等 $state: #須管理對象的類型 - $state: states #定制對象的狀態
示例:
apache: #state名稱:apache pkg: #管理對象類型:pkg,進行軟件安裝(yum、apt) - installed #pkg要執行的方法:install,如未安裝就進行安裝 service: #管理對象類型:service,管理系統守護進程 - running #service要執行的方法:running,如未運行就進行啟動 - require: #關鍵字require,確保apache服務只有在成功安裝軟件包后才會啟動 - pkg: apache
注:---關鍵字說明
require:在運行此state之前,先運行依賴的state關系檢查,可配置多個state依賴對象;
watch:在檢查摸個state發生變化時運行此模塊。
state的使用
state的入口文件與pillar一樣,文件名都是top.sls,但state要求sls文件必須存放在Saltstack base定義的目錄下(默認為/srv/salt)。
state描述配置*.sls支持jinjia模板、grains及pillar引用等,在state的邏輯層次定義完成后,再通過salt '*' state.highstate執行生效。
示例:
結合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 #刷新pillar salt '*' pillar.data pkgs #獲取pkgs信息
定義state
【/srv/salt/top.sls】
base: '*': - apache
【/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: - pkg: {{ pillar['pkgs']['apache'] }}
執行state
salt '*' state.highstate
結果:
參考資料:
根據劉天斯《Python自動化運維技術與最佳實踐》整理