Highstate資料結構定義

yinchuan發表於2013-06-01

參考連結:官方文件

作者言

這篇文件詳細解釋了SLS檔案中,每個部分的名稱與含義,以及SLS中的資料處理後的資料結構。

我只是SaltStack的初學者,如果文中有錯誤的地方,請不吝賜教。
在學習的過程,我做了一些實驗,犯了不少錯,積累了一些經驗,對SaltStack的執行也有一定了解,如果有什麼問題,或是不太理解的地方,非常歡迎留言交流!

Salt State Tree

Top file

Salt State系統的入口檔案,其中定義了minion處於哪個環境,載入哪些SLS模組。

State tree

存放在file_roots目錄下的一系列SLS檔案。使用SLS模組的形式來組織State tree。

Include宣告

Include宣告

一個list,其元素是要引用到本SLS檔案的其他SLS模組。 只能用在highstate結構的頂層。

示例:

include:
  - edit.vim
  - http.server

Module引用

Module引用

SLS模組的名字,以在Salt master上的檔案結構命名。名為edit.vim的模組指向salt://edit/vim.sls

ID宣告

ID宣告

定義一個獨立的highstate資料段。ID在highstate dict中作為key,其對應的value是包含state宣告和requisit宣告的另一個dict。
用在highstate結構的頂層或extend宣告的下一層。
ID在整個State tree中必須是唯一的。如果同一個ID用了兩次,只有最先匹配到的生效,其他所有的同名ID宣告被忽略。

Extend宣告

Extend宣告

擴充套件被引用的SLS模組中的name宣告。extend宣告也是一個dict,其key必須是在被引用的SLS模組中定義的ID。
只能用在highstate結構的頂層。

在需要增加或修改另一個SLS檔案中定義的state宣告時,Extend宣告非常有用。下面的程式碼來自mywebsite.sls檔案,其中include並且extend了apache.sls模組(增加了apache監視的物件),使得Apache服務在配置檔案mywebsite發生改變時自動重啟。

include:
  - apache

extend:
  apache:
    service:
      - watch:
        - file: mywebsite

mywebsite:
  file:
    - managed

State宣告

State宣告

一個list,至少包含一個定義function宣告的string,0個或多個function arg宣告的dict。
還有一些可選的成員,比如名字覆蓋部分(name和names宣告),requistie宣告。
只能用在ID宣告的下一級。

Requisite宣告

Requisite宣告

一個list,其成員是requisite引用。
用來生成動作依賴樹。Salt states被設計成按確定的順序執行,require或watch其他Salt state可以調整執行的順序。
做為list元件用在state宣告下一級,或是作為key用在ID宣告下一級。

Requisite引用

Requisite引用

只有一個key的dict。key是被引用的state宣告的名字,value是被引用的ID宣告的名字。 只能用作requisite宣告的成員。

Function宣告

Function宣告

state中要要執行的function。1個state宣告中只能有1個function宣告。

下面的例子中,state宣告呼叫了state模組pkg模組中的installed功能。

httpd:
  pkg.installed

可以用行內縮寫方式宣告function(上面的例子中就是),使用完整寫法使得資料結構更清晰:

httpd:
  pkg:
    - installed

需要注意的是連續的兩個簡寫形式是無效的,為了避免疑惑,建議全部採用完整寫法。
INVALID:

httpd:
  pkg.installed
  service.running

VALID:

httpd:
  pkg:
    - installed
  service:
    - running

只能用作state宣告的成員。

Function arg宣告

Function arg宣告

只有1個key的dict,作為引數傳遞給function宣告,其值為有效的Python型別。其型別必須滿足function的需要。 用在function宣告下一級。

下面的例子中,state宣告是file,function宣告是managed,user、group和mode是傳遞給managed的引數:

/etc/http/conf/http.conf:
  file.managed:
    - user: root
    - group: root
    - mode: 644

Name宣告

Name宣告

覆蓋state宣告中的name引數。name引數的預設值是ID宣告。 name總是1個單key字典,其值型別是string。

在有的場景下,修改預設的name引數非常有用。比如說,可以避免ID衝突。下面例子中的兩個state不能同時使用/etc/motd作為ID:

motd_perms:
  file.managed:
    - name: /etc/motd
    - mode: 644

motd_quote:
  file.append:
    - name: /etc/motd
    - text: "Of all smells, bread; of all tastes, salt."

另外一個使用name宣告的場景是,ID宣告非常長,又需要在多次引用這個ID。在下面的例子,使用mywebsite/etc/apache2/sites-available/mywebsite.com方便多了:

mywebsite:
  file.managed:
    - name: /etc/apache2/sites-available/mywebsite.com
    - source: salt://mywebsite.com

a2ensite mywebsite.com:
  cmd.wait:
    - unless: test -L /etc/apache2/sites-enabled/mywebsite.com
    - watch:
      - file: mywebsite

apache2:
  service:
    - running
    - watch:
      - file: mywebsite

Names宣告

Names宣告

將1個state宣告擴充套件為多個不同名的state宣告。

看下面的例子:

python-pkgs:
  pkg.installed:
    - names:
      - python-django
      - python-crypto
      - python-yaml

轉換成lowstate後的結果是:

python-django:
  pkg.installed

python-crypto:
  pkg.installed

python-yaml:
  pkg.installed

完整的例子

下面的YAML是一個完整的例子,其中的名字部分使用的是hightstate元件名。

<Include Declaration>:
  - <Module Reference>
  - <Module Reference>

<Extend Declaration>:
  <ID Declaration>:
    [<overrides>]


# standard declaration

<ID Declaration>:
  <State Declaration>:
    - <Function>
    - <Function Arg>
    - <Function Arg>
    - <Function Arg>
    - <Name>: <name>
    - <Requisite Declaration>:
      - <Requisite Reference>
      - <Requisite Reference>


# inline function and names

<ID Declaration>:
  <State Declaration>.<Function>:
    - <Function Arg>
    - <Function Arg>
    - <Function Arg>
    - <Names>:
      - <name>
      - <name>
      - <name>
    - <Requisite Declaration>:
      - <Requisite Reference>
      - <Requisite Reference>


# multiple states for single id

<ID Declaration>:
  <State Declaration>:
    - <Function>
    - <Function Arg>
    - <Name>: <name>
    - <Requisite Declaration>:
      - <Requisite Reference>
  <State Declaration>:
    - <Function>
    - <Function Arg>
    - <Names>:
      - <name>
      - <name>
    - <Requisite Declaration>:
      - <Requisite Reference>

相關文章