STATES TUTORIAL(第五部分)

EXTENDING EXTERNAL SLS DATA

扩展额外的sls数据,当一个sls文件需要被局部修改的时候,譬如当一个state文件需要添加watch条件的时候。


THE EXTEND DECLARATION

通过extend扩展sls数据,一般通过include导入一个ID declaration。
示例:

 1 include:
 2   - http
 3   - ssh
 4 
 5 extend:
 6   apache:
 7     file:
 8       - name: /etc/httpd/conf/httpd.conf
 9       - source: salt://http/httpd2.conf
10   ssh-server:
11     service:
12       - watch:
13         - file: /etc/ssh/banner
14 
15 /etc/ssh/banner:
16   file.managed:
17     - source: salt://ssh/banner
View Code

(1)重写apache声明的file模块的name,source参数。
(2)为ssh-server声明的service模块添加一个依赖关系/etc/ssh/banner


EXTEND IS A TOP LEVEL DECLARATION

EXTEND是一个顶级的声明,所以一个sls文件中只能使用一个extend块。
错误的一个示例:

 1 include:
 2   - http
 3   - ssh
 4 
 5 extend:
 6   apache:
 7     file:
 8       - name: /etc/httpd/conf/httpd.conf
 9       - source: salt://http/httpd2.conf
10 # Second extend will overwrite the first!! Only make one
11 extend:
12   ssh-server:
13     service:
14       - watch:
15         - file: /etc/ssh/banner
View Code

THE REQUISITE "IN" STATEMENT

在sls文件中使用IN语法
将上面的例子利用IN逻辑进行重写,这样显得逻辑更加清晰。

1 include:
2   - ssh
3 
4 /etc/ssh/banner:
5   file.managed:
6     - source: salt://ssh/banner
7     - watch_in:
8       - service: ssh-server
View Code

解析:
上面的extend例子扩展ssh-server的service模块,添加一个watch依赖条件,而在下面的示例则添加了一个/etc/ssh/banner新的ID声明,利用watch_in与ssh-server关联起来,一个是在ID声明里面定义一个依赖,一个是声明一个新ID定义一个被依赖。

#####################################################################################

FAILHARD GLOBAL OPTION

failhard全局选项

有时候执行一个state文件的时候,除了执行使用require等有依赖关系的ID声明以外,我们可能需要定义一个全局选项,当这个ID声明执行失败的时候,整个state文件停止执行。

1 /etc/yum.repos.d/company.repo:
2   file.managed:
3     - source: salt://company/yumrepo.conf
4     - user: root
5     - group: root
6     - mode: 644
7     - order: 1
8     - failhard: True
View Code

因为部署环境的基础一般建立在yum源上,所以当包源配置出现故障的时候,应当停止其他的state模块执行。


GLOBAL FAILHARD

在全局配置中使用FAILHARD选项

有时候我们可能想在执行所有state文件的时候,只要一个ID执行失败就停止其余的ID执行,这时候我们不需要在每一个
state中定义FAILHARD,可以在master配置文件中定义FAILHARD选项,作为全局配置。

#####################################################################################

HIGHSTATE DATA STRUCTURE DEFINITIONS

THE SALT STATE TREE

sls文件和目录被定义在file_roots里面,state tree下面的文件和目录名必须不包含点号。


TOP FILE

主state文件,用于引导minion执行时使用什么环境和模块,配置路径在master的配置文件中state_top选项。


INCLUDE DECLARATION

include出现在sls数据结构的最顶级
示例:

1 include:
2   - edit.vim
3   - http.server
View Code

MODULE REFERENCE

sls模块文件作为一个独立的sls文件被定义,放在salt master里面,譬如edit.vim就会被通过salt://edit/vim.sls引用。


ID DECLARATION

作为highstate的一个组件,总是包含一个state声明和一个Requisite declaration,能被一个Name declaration或Names declaration重写。

位于顶层结构的下面或extend声明的下面。在整个状态树下ID声明必须是唯一的,如果有多个其余的会被忽略掉,只有第一个被使用,因为所有的ID声明在一个命名空间中。


EXTEND DECLARATION

在一个include的sls模块中extend一个name declaration的前提需要是这个name declaration在include进来的sls文件中已存在。

注意:
  (1)extend只位于顶层结构中
  (2)一个sls文件只能有一个extend扩展

在增加或重写State declaration的时候EXTEND DECLARATION是非常有用的,最常用的就是添加一个watch或require条件等。
示例:

 1 include:
 2   - apache
 3 
 4 extend:
 5   apache:
 6     service:
 7       - watch:
 8         - file: mywebsite
 9 
10 mywebsite:
11   file.managed:
12     - name: /var/www/mysite
View Code

STATE DECLARATION

一个包含Function declaration和任意数目的Function arg declaration键值对形成的列表。
可选的,一些额外的组件,如重写部分,name和names,也可以包含一些requisite declarations,被放在ID declaration下面。


REQUISITE DECLARATION

必要的声明

用于构建依赖关系的必要部分,当state以一种特定的顺序进行执行的时候,它可以通过require和watch约束salt state文件的执行。作为 State declaration下的一个列表组件或ID declaration下的一个键。


REQUISITE REFERENCE

一个简单的键字典,键的名称是State declaration值是ID declaration


FUNCTION DECLARATION

函数声明被包含在state里面,一个state只能包含一个函数声明。
示例:

1 httpd:
2   pkg.installed: []
View Code

或这样的内联格式

1 httpd:
2   pkg:
3     - installed
View Code

当在一个ID声明中使用多个函数时,需要使用标准格式,如果参数没有也需要定义一个空列表。
示例:

1 httpd:
2   pkg.installed: []
3   service.running: []
View Code

FUNCTION ARG DECLARATION 

函数参数定义

使用一个或多个简单的键值对作为参数传递给Function declaration。
示例:

1 /etc/http/conf/http.conf:
2   file.managed:
3     - user: root
4     - group: root
5     - mode: 644
View Code

NAME DECLARATION

name定义

重写State declaration里面的name参数,如果name参数没有被定义的话,默认使用ID declaration。
示例:

1 motd_perms:
2   file.managed:
3     - name: /etc/motd
4     - mode: 644
5 
6 motd_quote:
7   file.append:
8     - name: /etc/motd
9     - text: "Of all smells, bread; of all tastes, salt."
View Code

由于可能存在多个name参数值是相同的,这种情况下就不能使用ID declaration作为默认的name参数。

重写name参数的另一个原因可能是由于ID declaration太长了,不便于引用。
示例:

 1 mywebsite:
 2   file.managed:
 3     - name: /etc/apache2/sites-available/mywebsite.com
 4     - source: salt://mywebsite.com
 5 
 6 a2ensite mywebsite.com:
 7   cmd.wait:
 8     - unless: test -L /etc/apache2/sites-enabled/mywebsite.com
 9     - watch:
10       - file: mywebsite
11 
12 apache2:
13   service.running:
14     - watch:
15       - file: mywebsite
View Code

NAMES DECLARATION

names参数定义

从一个State declaration扩展到多个state declarations的时候,可以使用names参数:

1 python-pkgs:
2   pkg.installed:
3     - names:
4       - python-django
5       - python-crypto
6       - python-yaml
View Code

一旦转换成底层的数据结构会变成一下数据结构:

1 python-django:
2   pkg.installed
3 
4 python-crypto:
5   pkg.installed
6 
7 python-yaml:
8   pkg.installed
View Code

可以通过设置额外的字典结构重写部分参数:
示例:

 1 ius:
 2   pkgrepo.managed:
 3     - humanname: IUS Community Packages for Enterprise Linux 6 - $basearch
 4     - gpgcheck: 1
 5     - baseurl: http://mirror.rackspace.com/ius/stable/CentOS/6/$basearch
 6     - gpgkey: http://dl.iuscommunity.org/pub/ius/IUS-COMMUNITY-GPG-KEY
 7     - names:
 8         - ius
 9         - ius-devel:
10             - baseurl: http://mirror.rackspace.com/ius/development/CentOS/6/$basearch
View Code

添加了两个name参数,相当于设置了两个repo源。


LARGE EXAMPLE

一个较大的示例,一个使用yaml格式的数据格式:

 1 <Include Declaration>:
 2   - <Module Reference>        #模块函数,state modules
 3   - <Module Reference>
 4 
 5 <Extend Declaration>:        #重写已存在的ID declaration
 6   <ID Declaration>:
 7     [<overrides>]
 8 
 9 
10 # standard declaration
11 
12 <ID Declaration>:
13   <State Module>:
14     - <Function>
15     - <Function Arg>
16     - <Function Arg>
17     - <Function Arg>
18     - <Name>: <name>
19     - <Requisite Declaration>:
20       - <Requisite Reference>
21       - <Requisite Reference>
22 
23 
24 # inline function and names
25 
26 <ID Declaration>:
27   <State Module>.<Function>:
28     - <Function Arg>
29     - <Function Arg>
30     - <Function Arg>
31     - <Names>:
32       - <name>
33       - <name>
34       - <name>
35     - <Requisite Declaration>:
36       - <Requisite Reference>
37       - <Requisite Reference>
38 
39 
40 # multiple states for single id
41 
42 <ID Declaration>:
43   <State Module>:
44     - <Function>
45     - <Function Arg>
46     - <Name>: <name>
47     - <Requisite Declaration>:
48       - <Requisite Reference>
49   <State Module>:
50     - <Function>
51     - <Function Arg>
52     - <Names>:
53       - <name>
54       - <name>
55     - <Requisite Declaration>:
56       - <Requisite Reference>
View Code

以上是一个相当全的一个模板示例,但是具体的使用方法还需要参考具体的模块和参数的使用方法。

原文地址:https://www.cnblogs.com/solitarywares/p/7513015.html