清单插件

清单插件允许用户指向数据源以编译 Ansible 用于将任务目标化的主机清单,可以使用 -i /path/to/file 和/或 -i 'host1, host2' 命令行参数或来自其他配置源。如有必要,您可以创建自定义清单插件

启用清单插件

Ansible 附带的大多数清单插件默认情况下都是启用的,或者可以使用 auto 插件。

在某些情况下,例如,如果清单插件不使用 YAML 配置文件,您可能需要启用特定插件。您可以通过在 ansible.cfg 文件的 [inventory] 部分设置 enable_plugins 来执行此操作。修改此设置将覆盖已启用插件的默认列表。以下是 Ansible 附带的已启用插件的默认列表

[inventory]
enable_plugins = host_list, script, auto, yaml, ini, toml

如果插件位于集合中并且未被 auto 语句拾取,则可以附加完全限定名称

[inventory]
enable_plugins = host_list, script, auto, yaml, ini, toml, namespace.collection_name.inventory_plugin_name

或者,如果它是一个本地插件,可能存储在 DEFAULT_INVENTORY_PLUGIN_PATH 设置的路径中,您可以按如下方式引用它

[inventory]
enable_plugins = host_list, script, auto, yaml, ini, toml, my_plugin

如果您使用支持 YAML 配置源的插件,请确保名称与清单源文件中的 plugin 条目中提供的名称匹配。对于其他插件,您必须将其保存到 ansible.cfg 中配置的目录源之一并启用它,或者添加到集合中,然后通过 FQCN 引用它。

使用清单插件

要使用清单插件,您必须提供一个清单源。大多数情况下,这是一个包含主机信息的文件或一个 YAML 配置文件,其中包含插件的选项。您可以使用 -i 标志提供清单源或配置默认清单路径。

ansible hostname -i inventory_source -m ansible.builtin.ping

要开始使用具有 YAML 配置源的清单插件,请创建一个文件,其中包含针对相关插件记录的已接受的文件名模式,然后添加 plugin: plugin_name。如果插件位于集合中,请使用完全限定名称。

注意

清单插件具有必须符合的必需名称模式,例如

包含 kubevirt.core.kubevirt 清单插件的清单必须使用 *.kubevirt.yml 文件名模式。包含 servicenow.servicenow.now 清单插件的清单必须使用 *.servicenow.yml 文件名模式。

# demo.aws_ec2.yml
plugin: amazon.aws.aws_ec2

每个插件都应记录任何命名限制。此外,YAML 配置文件必须以 ymlyaml 扩展名结尾,才能默认情况下通过 auto 插件启用(否则,请参见上面有关启用插件的部分)。

提供任何必需的选项后,您可以使用 ansible-inventory -i demo.aws_ec2.yml --graph 查看填充的清单

@all:
  |--@aws_ec2:
  |  |--ec2-12-345-678-901.compute-1.amazonaws.com
  |  |--ec2-98-765-432-10.compute-1.amazonaws.com
  |--@ungrouped:

如果您在 playbook 附属集合中使用清单插件,并希望使用 ansible-inventory 测试您的设置,请使用 --playbook-dir 标志。

您的清单源可能是一个清单配置文件目录。构建的清单插件仅对已存在于清单中的主机进行操作,因此您可能希望在特定时间点(例如最后)解析构建的清单配置。Ansible 递归地解析目录,按字母顺序排列。您无法配置解析方法,因此请命名您的文件以使其可预测地工作。直接扩展构建功能的清单插件可以通过添加构建选项以及清单插件选项来解决此限制。否则,您可以使用 -i 和多个源来强加特定顺序,例如 -i demo.aws_ec2.yml -i clouds.yml -i constructed.yml

您可以使用构建的 keyed_groups 选项使用主机变量创建动态组。选项 groups 也可用于创建组,而 compose 用于创建和修改主机变量。这是一个利用构建功能的 aws_ec2 示例

# demo.aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
  - us-east-2
keyed_groups:
  # add hosts to tag_Name_value groups for each aws_ec2 host's tags.Name variable
  - key: tags.Name
    prefix: tag_Name_
    separator: ""
  # If you have a tag called "Role" which has the value "Webserver", this will add the group
  # role_Webserver and add any hosts that have that tag assigned to it.
  - key: tags.Role
    prefix: role
groups:
  # add hosts to the group development if any of the dictionary's keys or values is the word 'devel'
  development: "'devel' in (tags|list)"
  # add hosts to the "private_only" group if the host doesn't have a public IP associated to it
  private_only: "public_ip_address is not defined"
compose:
  # use a private address where a public one isn't assigned
  ansible_host: public_ip_address|default(private_ip_address)
  # alternatively, set the ansible_host variable to connect with the private IP address without changing the hostname
  # ansible_host: private_ip_address
  # if you *must* set a string here (perhaps to identify the inventory source if you have multiple
  # accounts you want to use as sources), you need to wrap this in two sets of quotes, either ' then "
  # or " then '
  some_inventory_wide_string: '"Yes, you need both types of quotes here"'

现在 ansible-inventory -i demo.aws_ec2.yml --graph 的输出

@all:
  |--@aws_ec2:
  |  |--ec2-12-345-678-901.compute-1.amazonaws.com
  |  |--ec2-98-765-432-10.compute-1.amazonaws.com
  |  |--...
  |--@development:
  |  |--ec2-12-345-678-901.compute-1.amazonaws.com
  |  |--ec2-98-765-432-10.compute-1.amazonaws.com
  |--@role_Webserver
  |  |--ec2-12-345-678-901.compute-1.amazonaws.com
  |--@tag_Name_ECS_Instance:
  |  |--ec2-98-765-432-10.compute-1.amazonaws.com
  |--@tag_Name_Test_Server:
  |  |--ec2-12-345-678-901.compute-1.amazonaws.com
  |--@ungrouped

如果主机没有上面配置中的变量(换句话说,tags.Nametagsprivate_ip_address),则该主机将不会添加到除清单插件创建的组之外的其他组中,并且 ansible_host 主机变量将不会被修改。

支持缓存的清单插件可以使用 ansible.cfg 文件的 [defaults] 部分中定义的事实缓存的常规设置,或在 [inventory] 部分中定义清单特定的设置。各个插件可以在其配置文件中定义插件特定的缓存设置

# demo.aws_ec2.yml
plugin: amazon.aws.aws_ec2
cache: true
cache_plugin: ansible.builtin.jsonfile
cache_timeout: 7200
cache_connection: /tmp/aws_inventory
cache_prefix: aws_ec2

以下是在 ansible.cfg 文件中设置清单缓存以及用于缓存插件的一些事实缓存默认值和超时的示例

[defaults]
fact_caching = ansible.builtin.jsonfile
fact_caching_connection = /tmp/ansible_facts
cache_timeout = 3600

[inventory]
cache = yes
cache_connection = /tmp/ansible_inventory

插件列表

您可以使用 ansible-doc -t inventory -l 查看可用插件的列表。使用 ansible-doc -t inventory <plugin name> 查看插件特定的文档和示例。

另请参阅

Ansible playbook

playbook 简介

回调插件

回调插件

连接插件

连接插件

过滤器插件

过滤器插件

测试插件

测试插件

查找插件

查找插件

变量插件

变量插件

沟通

有问题?需要帮助?想分享你的想法?请访问 Ansible 沟通指南