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
(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
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
解析:
上面的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
因为部署环境的基础一般建立在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
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
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: []
或这样的内联格式
1 httpd: 2 pkg: 3 - installed
当在一个ID声明中使用多个函数时,需要使用标准格式,如果参数没有也需要定义一个空列表。
示例:
1 httpd: 2 pkg.installed: [] 3 service.running: []
FUNCTION ARG DECLARATION
函数参数定义
使用一个或多个简单的键值对作为参数传递给Function declaration。
示例:
1 /etc/http/conf/http.conf: 2 file.managed: 3 - user: root 4 - group: root 5 - mode: 644
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."
由于可能存在多个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
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
一旦转换成底层的数据结构会变成一下数据结构:
1 python-django: 2 pkg.installed 3 4 python-crypto: 5 pkg.installed 6 7 python-yaml: 8 pkg.installed
可以通过设置额外的字典结构重写部分参数:
示例:
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
添加了两个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>
以上是一个相当全的一个模板示例,但是具体的使用方法还需要参考具体的模块和参数的使用方法。