SaltStack State Requisites - 状态配置中的必要性依赖条件的使用方法介绍
发布日期:2021-05-20 07:23:15 浏览次数:20 分类:精选文章

本文共 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.xz
Extract 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.conf
file.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.conf
file.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-code
site-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_mount
backup_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 系统如何定义状态之间的依赖关系,并通过灵活的配置选项完成自动化任务。

上一篇:SaltStack State Modules - 状态模块开发技巧
下一篇:SaltStack SLS Template Variable Reference - SLS模板变量使用参考

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月20日 22时56分39秒