SaltStack State System Reference - State狀態系統參考資料

Salt提供了一個接口來管理Salt minions的配置或“狀態”。 此接口是一個完備的功能機制的實現,用於根據中心管理系統的定義強制管控本地的系統狀態。

您也可以參考在Github上維護的這一份技術資料:State System Reference

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章