Salt提供了一個接口來管理Salt minions的配置或“狀態”。 此接口是一個完備的功能機制的實現,用於根據中心管理系統的定義強制管控本地的系統狀態。
您也可以參考在Github上維護的這一份技術資料:State System Reference
- Mod Aggregate State Runtime Modifications - Mod聚合狀態運行時修改
- File State Backups - 文件狀態的備份管理
- Understanding State Compiler Ordering - 理解State狀態編譯的順序
- Extending External SLS Data - 使用外部的SLS擴展文件
- Failhard Global Option - 硬失敗的全局選項設置
- Highstate data structure definitions - Highstate數據結構的定義
- Include and Exclude - 包括與排除
- State System Layers - State狀態系統的層次
- Ordering States - 狀態的排序管理
- Running States in Parallel - 並行地執行States狀態
- State Providers - 狀態的功能支持模塊
- Requisites and Other Global State Arguments - 必要性依賴條件和其它一些全局狀態參數
- Startup States - 啓動時運行的狀態
- State Testing - 狀態的測試
- The Top File
- SLS Template Variable Reference - SLS模板變量使用參考
- State Modules - 狀態模塊
- State Management - 狀態管理
- Understanding the Salt State System Components - 理解Salt狀態系統組件
State Management 狀態管理
狀態管理,通常也稱爲軟件配置管理(SCM),是一種將系統保持在預定狀態的管理方法。 它安裝軟件包、啓動或重新啓動服務,或將配置文件放置到位並監視它們的更改。
有了狀態管理系統,就可以輕鬆可靠地配置和管理幾臺服務器或幾千臺服務器。 它允許將配置保存在版本控制管理下。
Salt State是我們在先前的遠程執行教程中討論的Salt模塊的擴展。 不再是基於一次性執行的方式來管理系統,可以輕鬆定義系統狀態,然後強制執行。
Understanding the Salt State System Components - 理解Salt State狀態系統組件
Salt狀態系統由許多組件組成。 作爲用戶,需要了解SLS和渲染器系統。 但是作爲開發人員,還需要了解Salt狀態以及如何編寫狀態。
注意:狀態僅在針對的目標minions上編譯和執行。 要直接在masters上執行功能,請參見runners。
Salt SLS System
Salt狀態系統主要使用的是SLS系統。 SLS代表SaLt State。
Salt狀態是包含有關如何配置Salt minions的信息的文件。 狀態放置在目錄樹中,並且可以用許多不同的格式編寫。
文件的內容及其佈局方式應儘可能簡單,同時要具有最大的靈活性。 這些文件按狀態排列,幷包含有關如何配置minions的信息。
SLS File Layout
SLS文件放置在Salt文件服務器中。
一個簡單的佈局如下所示:
top.sls
ssh.sls
sshd_config
users/init.sls
users/admin.sls
salt/master.sls
web/init.sls
top.sls
文件是關鍵組件。 top.sls
文件用於確定應將哪些SLS文件應用於哪個minions。
上面示例中帶有.sls
擴展名的其餘文件是狀態文件。
Salt master將不帶.sls
擴展名的文件視爲可以下載到Salt Minion的文件。
狀態會被轉換爲點表示法。 例如,ssh.sls
文件被視爲ssh
狀態,users/admin.sls
文件被視爲users.admin
狀態。
名爲init.sls
的文件將轉換爲父目錄的狀態名稱,因此web/init.sls
文件將轉換爲Web
狀態。
在Salt中,所有內容都是文件; 沒有文件和文件類型的“魔術翻譯”。 這意味着狀態文件可以像純文本文件或二進制文件一樣分發到minions。
SLS Files
Salt狀態文件是簡單的數據集。 由於SLS文件只是數據,因此可以用許多不同的方式表示它們。
默認格式是從Jinja
模板生成的YAML
。 這允許狀態文件具有Python的所有語言結構以及YAML的簡單性。
狀態文件可以是複雜的Jinja模板,可以轉換爲YAML,也可以只是簡單的YAML文件。
狀態文件只是簡單的通用數據結構,例如字典和列表,是使用模板語言(例如YAML)構造的。
這是Salt狀態的示例:
vim:
pkg.installed: []
salt:
pkg.latest:
- name: salt
service.running:
- names:
- salt-master
- salt-minion
- require:
- pkg: salt
- watch:
- file: /etc/salt/minion
/etc/salt/minion:
file.managed:
- source: salt://salt/minion
- user: root
- group: root
- mode: 644
- require:
- pkg: salt
這個簡短的段落將確保已安裝vim、Salt已安裝且是最新的、salt-master和salt-minion守護程序正在運行並且Salt minion配置文件已就緒。 它還將確保按正確的順序部署所有內容,並確保在監視文件更新時重新啓動Salt服務。
The Top File
Top file 文件用來控制minions和應用於它們的狀態之間的映射關係。
Top file 文件指定哪個minions應用哪個SLS文件,以及應從哪個環境提取這些SLS文件。
Top file 文件通過在頂層指定環境的關鍵字來工作。
每個環境都包含目標表達式以匹配minions。 最後,每個目標表達式都包含一個Salt狀態列表,以應用於匹配的minions:
base:
'*':
- salt
- users
- users.admin
'saltmaster.*':
- match: pcre
- salt.master
上面的示例使用默認Salt設置中內置的base
環境。
base
環境具有目標表達式。 第一個是匹配所有minions,它下方的SLS文件適用於所有minions。
第二個表達式是一個正則表達式,它將匹配所有帶有ID匹配saltmaster.*
的minions,並指定對於那些minions,應用salt.master
狀態。
重要:從2014.7.0版開始,默認匹配器(當未如上例中的第二個表達式中明確定義時)爲複合匹配器。 由於此匹配器解析表達式中的單個單詞,因此使用此匹配器將無法正確匹配包含空格的minion ID。 因此,如果您的目標表達式旨在匹配包含空格的minion ID,則必須指定其他匹配類型(例如glob)。 例如:
base:
'test minion':
- match: glob
- foo
- bar
- baz
一個完整的匹配類型說明表格,請參見這裏。
Reloading Modules - 重新加載模塊
一些Salt狀態要求安裝特定的軟件包才能加載模塊。 例如,pip狀態模塊需要pip包
才能進行正確的名稱和版本解析。
在大多數常見情況下,Salt足夠聰明,可以透明地重新加載模塊。 例如,如果您安裝軟件包,Salt會重新加載模塊,因爲某些其他模塊或狀態可能只需要已安裝的軟件包。
在某些情況下,可能需要告知Salt重新加載模塊。 考慮以下狀態文件,我們將其稱爲pep8.sls
:
python-pip:
cmd.run:
- name: |
easy_install --script-dir=/usr/bin -U pip
- cwd: /
pep8:
pip.installed:
- require:
- cmd: python-pip
上面的示例使用setuptools中的easy_install安裝pip,並使用pip安裝pep8,如前所述,這要求在整個系統範圍內安裝pip。 讓我們執行以下狀態:
salt-call state.apply pep8
上面命令的輸出會類似下面:
----------
State: - pip
Name: pep8
Function: installed
Result: False
Comment: State pip.installed found in sls pep8 is unavailable
Changes:
Summary
------------
Succeeded: 1
Failed: 1
------------
Total: 2
如果此時再執行一遍命令,則輸出會變成下面這樣:
----------
State: - pip
Name: pep8
Function: installed
Result: True
Comment: Package was successfully installed
Changes: pep8==1.4.6: Installed
Summary
------------
Succeeded: 2
Failed: 0
------------
Total: 2
由於我們使用cmd安裝了pip,因此Salt無法知道已安裝了系統範圍的軟件包。
在第二次執行時,由於已安裝了所需的pip包,因此狀態可以正確執行。
注意:Salt不會在每個狀態運行時都重新加載模塊,因爲這樣做會大大減慢狀態執行速度。
那麼我們如何解決這種極端情況呢? reload_modules
!
reload_modules
是在所有可用狀態下salt都可以識別的布爾選項,一旦給定的狀態完成設置,它就將強制salt重新加載其模塊。
修改後的狀態文件現在爲:
python-pip:
cmd.run:
- name: |
easy_install --script-dir=/usr/bin -U pip
- cwd: /
- reload_modules: true
pep8:
pip.installed:
- require:
- cmd: python-pip
現在,讓我們執行一次狀態配置命令:
salt-call state.apply pep8
輸出像下面這樣:
----------
State: - pip
Name: pep8
Function: installed
Result: True
Comment: Package was successfully installed
Changes: pep8==1.4.6: Installed
Summary
------------
Succeeded: 2
Failed: 0
------------
Total: 2