清单插件
清单插件允许用户指向数据源以编译 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 配置文件必须以 yml
或 yaml
扩展名结尾才能默认情况下通过 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:
如果你在剧本相邻的集合中使用清单插件,并且希望使用 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.Name
、tags
、private_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>
查看特定于插件的文档和示例。