14.2. 构建的清单


您可以从输入清单列表中创建新清单(称为构建的清单)。

构建的清单在其输入清单中具有主机和组副本,允许作业在很多清单中到目标服务器组。可将组和 hostvars 添加到清单内容中,并且可以过滤主机来限制构建的清单的大小。

构建的清单使用 ansible.builtin.constructed 清单 模型。

构建的清单的关键因素是:

  • 普通的 Ansible hostvars 命名空间可用
  • 它们提供组

构建的清单取 source_varslimit 作为输入,并将其 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 格式显示。建议第一个建议。

  1. 构造 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")。这有助于进行调试,如 调试提示 中所述。

  2. 构造 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_varslimit)所需的字段都已存在于清单源模型中。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.