
本文共 4777 字,大约阅读时间需要 15 分钟。
Requisites - 必要条件
Salt系统中的Requisites(必要条件)用于定义状态之间的依赖关系。当一个状态某种程度上依赖于另一个状态时,可以轻松定义这种依赖关系。这些依赖关系可以通过状态名称和ID或名称来表示,通常形式为 <state name>: <ID or name>
。
Requisites分为两种类型:direct requisites
(如 require
)和 requisite_in
(如 require_in
)。依赖关系是有方向的,直接的先决条件要求其他状态的某些条件,而 requisite_in
则将必要项插入到目标状态的目标状态中。
Requisite Matching - 必要性条件的匹配方法
Requisites需要两条信息进行匹配:状态模块名称(例如 pkg
)和标识符(例如 vim
)。标识符可以是状态的ID(节的第一行)或 -name
参数。
示例
- 简单形式:
- require: - pkg: vim
- 省略状态模块:
- require: - vim
State Target Matching - 目标状态匹配
为了理解如何匹配目标状态,考虑以下示例:
Deploy server package: file.managed: - name: /usr/local/share/myapp.tar.xz - source: salt://myapp.tar.xzExtract server package: archive.extracted: - name: /usr/local/share/myapp - source: /usr/local/share/myapp.tar.xz - archive_format: tar - onchanges: - file: Deploy server package
Identifier Matching - 标识符匹配
ID声明和 name
参数都需要匹配。这意味着在上面的“Deploy server package”示例中,require
要求匹配 Deploy server package
或 "/usr/local/share/myapp.tar.xz"
,因此以下两个版本的“Extract server package”均可使用:
示例
- 匪称ID声明:
Extract server package: archive.extracted: - onchanges: - file: Deploy server package
- 使用
name
参数:Extract server package: archive.extracted: - onchanges: - file: /usr/local/share/myapp.tar.xz
Omitting State Module - 省略状态模块
在2016.3.0版本中,状态模块名称被设置为可选。如果省略状态模块,则将要求与ID匹配的所有状态,无论它们使用的是哪个模块。
示例
- 使用省略的方法:
- require: - vim
State Target Matching - 目标状态匹配
为了了解如何匹配状态目标,可以参考以下内容。例如,文件 < Deploy server package>
的配置通常取决于 vim
软件包是否已安装。
Requisite Overview - 必要性条件一览表
以下表格列出了所有必要条件及其相关信息:
始末 | 必要性条件名称 | 目标执行结果 | 目标状态发生变化 | 顺序 | 注释 |
---|---|---|---|---|---|
肯定,否则不执行 | require | 成功 | default | 状态将始终执行,除非目标失败 | |
watch | 成功 | default | 与 require 类似,但添加额外行为(mod_watch ) | ||
prereq | 成功 | 有变化 | 换行 | 类似于 onchanges ,但顺序不同 | |
onchanges | 成功 | 有变化 | default | 仅在目标成功且发生变化时执行 | |
onfail | 失败 | default | 仅在目标失败时执行 | ||
require_any | 至少一个成功 | default | 需要状态中任意一个成功 | ||
watch_any | 至少一个成功 | 可能有变化 | default | 类似于 require_any | |
prereq_in | default | 与 prereq 类似,但方向相反 | |||
onfail_any | 至少一个失败 | default | 仅当至少一个目标失败时响应 |
Direct Requisite and Requisite_in Types - 直接必要条件和逆向必要条件
以下是可以在Salt中使用的直接必要条件:
require
watch
prereq
use
onchanges
onfail
每个直接必要条件都有相应的 in
版本。例如:
require_in
对应require
watch_in
对应watch
require - 确定必需状态
require
语句用于要求必需状态在从属状态之前执行。包含 require
的状态定义为从属状态,而声明中的状态则定义为必需状态。
示例
vim: pkg.installed/etc/vimrc: file.managed: - source: salt://edit/vimrc - require: - pkg: vim
在上面的示例中,文件 /etc/vimrc
的配置仅在 vim
软件包已安装的情况下才执行。
require_any - 任意必需状态
require_any
语句要求至少有一个必需状态在从属状态之前执行。包含 require_any
的状态定义为从属状态,而声明中的状态定义为必需状态。如果至少一个必需状态成功,行为状态将执行;如果所有必需状态都失败,则行为状态将不会执行。
示例
A: cmd.run: - name: echo A - require_any: - cmd: B - cmd: C - cmd: D
watch - 监视状态
watch
语句用于在目标状态发生变化时添加其他行为。watch
状态返回一个包含 changes
键的字典,表示发生了哪些变化。
示例
ntpd: service.running: - watch: - file: /etc/ntp.conffile.managed: - name: /etc/ntp.conf - source: salt://ntp/files/ntp.conf
watch_any - 任意监视状态
watch_any
语句用于在目标状态发生变化时添加其他行为。watch_any
的工作原理与 watch
类似,但它监视多个目标状态。如果任何一个目标状态满足条件,则行为状态将执行。
示例
apache2: service.running: - watch_any: - file: /etc/apache2/sites-available/site1.conf - file: /etc/apache2/sites-available/site2.conffile.managed: - name: /etc/apache2/sites-available/site1.conf - source: salt://apache2/files/site1.conf
prereq - 预先确认所需状态
prereq
语句允许根据尚未执行的状态预期结果采取措施。包含 prereq
的状态被定义为预先确认状态,而声明中的状态则定义为预认证状态。
示例:
graceful-down: cmd.run: - name: service apache graceful - prereq: - file: site-codesite-code: file.recurse: - name: /opt/site_code - source: salt://site/code
onfail - 对失败响应
onfail
语句允许在目标状态失败时采取特别措施。例如,可以尝试重新启动服务或执行其他恢复操作。
示例
primary_mount: mount.mounted: - name: /mnt/share - device: 10.0.0.45:/share - fstype: nfs - onfail: - mount: backup_mountbackup_mount: mount.mounted: - name: /mnt/share - device: 192.168.40.34:/share - fstype: nfs
use - 继承配置参数
use
语句用于在多个文件中共享相同的配置值。例如,可以定义一个默认值,然后在多个文件中重复使用。
示例
/etc/foo.conf: file.managed: - source: salt://foo.conf - template: jinja - mkdirs: True - user: apache - group: apache - mode: 755/etc/bar.conf: file.managed: - source: salt://bar.conf - use: - file: /etc/foo.conf
runas - 设置运行用户
runas
全局选项用于指定在 {cmd.run}
模块中执行命令的用户。
示例
django: pip.installed: - name: django >= 1.6, < 1.7 - runas: daniel - require: - pkg: python-pip
runas_password - 设置运行用户密码
runas_password
用于指定在 Windows 上的 cmd.run
模块中使用的密码。当 runas
Specified 时,需要设置这个密码。
示例
run-script: cmd.run: - name: Powershell -NonInteractive -ExecutionPolicy Bypass -File C:\Temp\script.ps1 - runas: frank - runas_password: supersecret
Inizyon(Inverse Requisites)- 逆向必要条件
所有 Requisites 组件还有对应的 in
版本,其用途是逆向定义依赖关系。例如,require_in
用于定义一个状态依赖于另一个状态。
示例
httpd: pkg.installed: - require_in: - service: httpd
在单独的 SLS 文件中定义 require_in
是非常有用的。例如,httpd
可能需要 PHP 或 mod_python 组件,但 HTTP 状态本身并不需要在设置时就知道这些组件。
通过以上内容,可以清晰地理解 Salt 系统中的 Requisites 系统如何定义状态之间的依赖关系,并通过灵活的配置选项完成自动化任务。
发表评论
最新留言
关于作者
