saltstack的深入-highstate概念

一、初识
1、HIGHSTATE 数据结构的定义

1)salt状态树(THE SALT STATE TREE)
状态树(state tree) 指的是在file_roots中定义的目录下分类保存,供模块(module)调用的那些sls文件。

2)入口文件(TOP FILE)
一个入口状态(state)文件 可以在state执行时指示 minions 在什么环境(env)和模块(module)下使用

3)包含申明(INCLUDE DECLARATION)
定义一个列表,包括要引用的模块名称。
生效:位于highstate的顶层(top level)
举例:
include:
  - edit.vim
  - http.server

4)模块引用(MODULE REFERENCE)
sls模块名称。例如模块名“edit.vim”代表 salt://edit/vim.sls 这个sls文件,位于Salt Master上file_roots下定义的路径(默认是/srv/salt/)/srv/salt/edit/vim.sls

5)ID申明(ID DECLARATION)
定义一个独立的 highstate 组件(component),包括State declaration 和 Requisite declaration中的key-value,可以被Name declaration 或 Names declaration覆盖。

生效:位于顶层或在Extend declaration下面一层
要求:在整个state tree中是唯一的,如果有多个同样的的id,则第一个被匹配的生效。

6)扩展申明(EXTEND DECLARATION)
扩展某个要include的sls模块中的 Name declaration,这个扩展模块中的key和要include的那个sls模块中的ID declaration关联一致。

生效:位于顶层,定义了一个字典
注意:在一个单独的state运行时只能被扩展一次。

7)状态申明(STATE DECLARATION)
一个列表,包括一个字符串代表了函数申明(Function declaration),和多个函数的参数申明(Function arg declaration)的字典(dict)
可以包括许多附加组件(component),例如名称覆盖组件(name和names),必要条件申明(requisite declarations)
生效:位于ID declaration下面一层

8)必要条件申明(REQUISITE DECLARATION)
包括一系列的必要条件,用来建立行为依赖树(the action dependency tree)。
Salt的状态同步执行时是有一个明确的顺序,这个顺序的确定,需要依赖和观察( requiring and watching )其他的状态(Salt states)
生效:位于ID declaration下面一层,作为一个组件列表或者一个key
Occurs as a list component under a State declaration or as a key under an ID declaration.

9)必要条件引用(REQUISITE REFERENCE)
一个单独的字典,key和State declaration一致,value和ID declaration一致
生效:位于Requisite declaration下面一层

10)函数申明(FUNCTION DECLARATION)
要调用的函数名称。
生效:
注意:一个状态申明(state declaration)只能包括一个函数申明
举例:在状态模块(state module)pkg中调用函数“installed”:
httpd:
  pkg.installed: []
  
函数和状态在一行(inline)被简短的申明。实际上,数据结构被编译成这样:
httpd:
  pkg:
    - installed
函数是状态申明(state declaration)中的一个字符串。
从技术上而言,当函数以圆点记法“.”的方式申明时,编译器会转换成状态申明列表(state declaration list)中的一个字符串。

如下是错误的申明:
httpd:
  pkg.installed
  service.running
当没有传参给函数, 且后续还有其他的状态申明,则要使用标准格式,否则将不是一个有效的数据结构。

这才是正确的:
httpd:
  pkg.installed: []
  service.running: []
生效:位于State declaration下面一层

11)函数参数申明(FUNCTION ARG DECLARATION)
一个字典传递给函数
生效:位于Function declaration下面一层
举例:在下面的状态申明中, user, group, and mode 作为参数传递给函数“managed”:

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

12)name申明(NAME DECLARATION)
重写一个状态申明中的name参数,如果未指定name,则“ID declaration”将作为name参数
举例:重写name的用法很多,如避免ID申明冲突,例如下面的例子中,2个状态申明不能同时将/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."

另一个通常的原因是,如果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

13)names申明(NAMES DECLARATION)
将状态申明的内容展开为多个状态申明,每个都有自己的name
举例:有这样一个申明:
python-pkgs:
  pkg.installed:
    - names:
      - python-django
      - python-crypto
      - python-yaml
转换成lowstate data structure 则变成:

python-django:
  pkg.installed

python-crypto:
  pkg.installed

python-yaml:
  pkg.installed
  
通过一个附加的字典,可以在展开时改写一些值,例如:
New in version 2014.7.0.

ius:
  pkgrepo.managed:
    - humanname: IUS Community Packages for Enterprise Linux 6 - $basearch
    - gpgcheck: 1
    - baseurl: http://mirror.rackspace.com/ius/stable/CentOS/6/$basearch
    - gpgkey: http://dl.iuscommunity.org/pub/ius/IUS-COMMUNITY-GPG-KEY
    - names:
        - ius
        - ius-devel:
            - baseurl: http://mirror.rackspace.com/ius/development/CentOS/6/$basearch

2、LARGE EXAMPLE
这是一个yaml的布局:

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

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


# 标准申明(standard declaration)

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


# 函数内嵌(inline function and names)

<ID Declaration>:
  <State Module>.<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 Module>:
    - <Function>
    - <Function Arg>
    - <Name>: <name>
    - <Requisite Declaration>:
      - <Requisite Reference>
  <State Module>:
    - <Function>
    - <Function Arg>
    - <Names>:
      - <name>
      - <name>
    - <Requisite Declaration>:
      - <Requisite Reference>







ZYXW、参考
1、doc
http://docs.saltstack.com/en/latest/ref/states/highstate.html