有时,需要通过对一个单独的SLS文件的修改来更新另一个SLS文件中定义的状态。 一个很好的例子是需要覆盖参数或服务需要监视其他状态的时候。
扩展的标准方法是使用扩展声明。 扩展声明是诸如include
之类的顶级声明,并封装了其他SLS文件中包含的ID声明数据。 标准扩展看起来像下面这样:
include:
- http
- ssh
extend:
apache:
file:
- name: /etc/httpd/conf/httpd.conf
- source: salt://http/httpd2.conf
ssh-server:
service:
- watch:
- file: /etc/ssh/banner
/etc/ssh/banner:
file.managed:
- source: salt://ssh/banner
这里发生了一些重要的事情,首先include了将要扩展的SLS文件,然后定义了扩展内容。 在扩展内容部分下,apache ID的文件状态被新名称和源所覆盖。 然后,又将ssh服务扩展为增加监视banner文件。
这意味着扩展只能在sls中被调用一次,如果扩展被使用了两次,则仅有扩展块之一将被读取。 所以下面这个例子中的使用方法就是错误的:
include:
- http
- ssh
extend:
apache:
file:
- name: /etc/httpd/conf/httpd.conf
- source: salt://http/httpd2.conf
# Second extend will overwrite the first!! Only make one
extend:
ssh-server:
service:
- watch:
- file: /etc/ssh/banner
由于扩展另一个SLS时最常做的事情之一就是为要监视的服务添加状态,或者为观察者添加任何内容,因此0.9.8中已添加in语句中的必要条件,以使扩展观察范围和依赖要求列表更容易 。 上面的ssh-server extend语句可以更清晰地定义为:
include:
- ssh
/etc/ssh/banner:
file.managed:
- source: salt://ssh/banner
- watch_in:
- service: ssh-server
扩展状态时要记住一些规则:
- 始终通过include包含声明扩展的SLS
- 必要性依赖(watch和require)附加到其他内容时,其他内容均被覆盖
- 扩展是顶级声明,就像ID声明一样,不能在单个SLS中声明两次
- 可以在扩展声明下扩展许多ID
通常,当状态失败时,Salt继续执行其余已定义状态,并且只会拒绝执行需要依赖于失败状态的状态。
但是这种情况可能存在,如果单个状态执行失败,您希望所有状态执行都停止。 执行此操作的能力称为“failing hard
”。
单个状态上可以设置一个failhard配置项,这意味着如果该单个状态失败,则所有状态的执行将立即停止。 如果存在一个设置关键配置文件的状态,并且为读取配置的每个状态设置一个需求会很麻烦,那么这是一件很棒的事情。 一个很好的例子是尽早设置软件包管理器的状态管理:
/etc/yum.repos.d/company.repo:
file.managed:
- source: salt://company/yumrepo.conf
- user: root
- group: root
- mode: 644
- order: 1
- failhard: True
在这种情况下,将在其他状态之前配置yum存储库,如果无法放置配置文件,则不会执行任何其他状态。 通过在状态中将failhard显式设置为False,可以覆盖Global Failhard的全局设置。
如果希望对执行的每个状态都应用Failhard设置,这种情况,则可以在master配置文件中设置failhard。在master服务器配置文件中设置failhard会导致所有受管理的minions在发生一个状态失败时直接引发状态执行的硬失败。
这不是默认行为,通常Salt只会将那些需要失败状态的状态进行处理。
通常不建议使用全局性的Failhard设置,因为它可能导致状态无法执行甚至无法通过检查。 如果管理员没有主动意识到已经设置了failhard,则看到状态为失败时也会令人困惑。
要使用全局failhard,请在master配置文件中将failhard设置为True。