14.2. 构建的清单
您可以从输入清单列表中创建新清单(称为构建的清单)。
构建的清单在其输入清单中具有主机和组副本,允许作业在很多清单中到目标服务器组。可将组和 hostvars 添加到清单内容中,并且可以过滤主机来限制构建的清单的大小。
构建的清单使用 ansible.builtin.constructed 清单 模型。
构建的清单的关键因素是:
- 普通的 Ansible hostvars 命名空间可用
- 它们提供组
构建的清单取 source_vars
和 limit
作为输入,并将其 input_inventories
转换为新清单,随组一起完成。组(现有或构建)可以在 limit
字段中引用,以减少生成的主机数量。
您可以根据以下主机属性构建组:
- RHEL 主版本或次版本
- Windows 主机
- 在特定区域中标记的基于云的实例
- 其他
后续小节中描述的示例由输入清单的结构进行组织。
14.2.1. 过滤组名称和变量
您可以根据组和变量的组合进行过滤。例如,您可以过滤与 group 变量值匹配的主机,同时匹配主机变量值。
执行此过滤器的方法有两种:
-
定义两个组:一个组来匹配 group 变量,另一个组与主机变量值匹配。使用
限制
模式返回两个组中的主机。这是推荐的方法。 -
定义一个组。在定义中,包含组和主机变量必须与特定值匹配的条件。使用
限制
模式返回新组中的所有主机。
Example:
以下清单文件定义了四个主机,并设置组和主机变量。它定义了一个产品组,一个 keeping group,它会将两个主机设置为关闭状态。
目标是创建一个仅返回关闭生产主机的过滤器。
[account_1234] host1 host2 state=shutdown [account_4321] host3 host4 state=shutdown [account_1234:vars] account_alias=product_dev [account_4321:vars] account_alias=sustaining
此处的目标是仅返回与 product_dev
相等的 account_alias
变量所存在的主机。这种方法有两种,它们都以 YAML 格式显示。建议第一个建议。
构造 2 个组,限制为交集 :
source_vars
:plugin: constructed strict: true groups: is_shutdown: state | default("running") == "shutdown" product_dev: account_alias == "product_dev"
限制
:is_shutdown:&product_dev
这个构建的清单输入会为这两个类别创建一个组,
并使用限制
(主机模式)来仅返回位于这两个组的交集中的主机,如 Patterns:以 主机和组为目标。当变量为 或 未定义(取决于主机)时,您可以指定一个默认值。例如,如果您知道未定义值,请使用
| default ("running")
。这有助于进行调试,如 调试提示 中所述。构造 1 组,限制为组 :
source_vars
:plugin: constructed strict: true groups: shutdown_in_product_dev: state | default("running") == "shutdown" and account_alias == "product_dev"
限制
:shutdown_in_product_dev
此输入会创建一个组,它只包含匹配这两个条件的主机。然后,限制本身只是组名称,返回 host2。与之前的方法相同。
14.2.2. 调试提示
务必要将 strict
参数设置为 true
,以便您可以调试模板的问题。如果模板无法呈现,则会在该构建的清单关联的清单更新中发生错误。
遇到错误时,会增加详细程度来获取更多详细信息。
提供默认值,如 | default ("running")
是 Ansible 中的 Jinja2 模板的通用使用。设置 strict: true
时,这可避免模板的错误。
您还可以设置 strict: false
,因此启用模板生成错误,这会导致主机没有包含在该组中。但是,如果模板继续复杂性,则在以后无法调试问题。
如果没有生成预期的清单内容,您可能仍必须调试模板的预期功能。例如,如果 组
组有一个复杂的过滤器(如 shutdown_in_product_dev
),但没有包含因构建的清单中的任何主机,则使用 compose
参数来帮助调试。
例如:
source_vars: plugin: constructed strict: true groups: shutdown_in_product_dev: state | default("running") == "shutdown" and account_alias == "product_dev" compose: resolved_state: state | default("running") is_in_product_dev: account_alias == "product_dev" limit: ``
使用空白 限制
运行会返回所有主机。您可以使用此选项检查特定主机上的特定变量,从而深入了解 组中
的问题。
14.2.3. 嵌套组
嵌套组由两个组组成,其中一个是另一个组的子组。在以下示例中,子组在其中有另一个主机,父组定义了一个变量。
由于 Ansible 核心运行方式,父组的变量在命名空间中作为 playbook 正在运行,并可用于过滤。
以下示例清单文件 nested.yml
是 YAML 格式:
all: children: groupA: vars: filter_var: filter_val children: groupB: hosts: host1: {} ungrouped: hosts: host2: {}
由于 host1
位于 groupB
中,因此它也位于 groupA
中。
过滤嵌套组名称
使用以下 YAML 格式过滤嵌套组名称:
`source_vars`: plugin: constructed `limit`: `groupA`
过滤嵌套组属性
使用以下 YAML 格式过滤组变量,即使主机间接是该组的成员。
请注意,在清单内容中,host2
不应定义变量 filter_var
,因为它不在任何组中。由于使用了 strict: true
,因此请使用默认值,以便定义没有该变量的主机。使用此选项时,host2
会从表达式返回 false
,而不是生成错误。host1
从其组中继承 变量,并且返回。
source_vars: plugin: constructed strict: true groups: filter_var_is_filter_val: filter_var | default("") == "filter_val" limit: filter_var_is_filter_val
14.2.4. Ansible 事实
要创建具有 Ansible 事实的清单,您必须针对具有设置 gather_facts: true
的清单运行一个 playbook。事实因 system-to-system 而异。以下示例并不能解决所有已知的场景。
14.2.4.1. 过滤环境变量
以下示例涉及使用 YAML 格式在环境变量上过滤:
source_vars: plugin: constructed strict: true groups: hosts_using_xterm: ansible_env.TERM == "xterm" limit: hosts_using_xterm
14.2.4.2. 根据处理器类型过滤主机
以下示例涉及使用 YAML 格式根据处理器类型(Intel)过滤主机:
source_vars: plugin: constructed strict: true groups: intel_hosts: "GenuineIntel" in ansible_processor limit: intel_hosts
构建中的主机不会根据您的许可证计算,因为它们引用原始清单主机。此外,原始清单中禁用的主机也不包含在构建的清单中。
使用 ansible-inventory
运行清单更新将创建构建的清单内容。
这始终配置为在作业前更新时启动,但您仍可以选择缓存超时值,以防这用时过长。
在创建构建的清单时,API 会确保它始终关联了一个清单源。所有清单更新都有一个关联的清单源,构建的清单(source_vars
和 limit
)所需的字段都已存在于清单源模型中。