使用动态清单

如果你的 Ansible 清单随着时间的推移而波动,主机根据业务需求启动和关闭,则 如何构建你的清单 中描述的静态清单解决方案将无法满足你的需求。你可能需要从多个来源跟踪主机:云提供商、LDAP、Cobbler 和/或企业 CMDB 系统。

Ansible 通过动态外部清单系统整合了所有这些选项。Ansible 支持两种与外部清单连接的方式:清单插件清单脚本

清单插件利用了 Ansible 核心代码的最新更新。我们建议将插件优先于脚本用于动态清单。你可以 编写自己的插件 来连接到其他动态清单源。

如果你愿意,仍然可以使用清单脚本。当我们实现清单插件时,我们通过脚本清单插件确保了向后兼容性。下面的示例说明了如何使用清单脚本。

如果你更喜欢使用 GUI 来处理动态清单,AWX 或 Red Hat Ansible 自动化平台 上的清单数据库会与你所有动态清单源同步,提供对结果的 Web 和 REST 访问,并提供图形清单编辑器。有了所有主机的数据库记录,你可以关联过去事件的历史记录,并查看哪些主机在最后一次剧本运行时出现故障。

清单脚本示例:Cobbler

Ansible 与 Cobbler 无缝集成,Cobbler 是一个 Linux 安装服务器,最初由 Michael DeHaan 编写,现在由 James Cammarata 领导,他在 Ansible 工作。

虽然主要用于启动操作系统安装并管理 DHCP 和 DNS,但 Cobbler 具有一个通用层,可以表示多个配置管理系统的(即使是同时)数据,并充当“轻量级 CMDB”。

要将你的 Ansible 清单与 Cobbler 绑定,请将 此脚本 复制到 /etc/ansiblechmod +x 该文件。在每次使用 Ansible 时运行 cobblerd,并使用 -i 命令行选项(例如,-i /etc/ansible/cobbler.py)通过 Cobbler 的 XMLRPC API 与 Cobbler 通信。

/etc/ansible 中添加一个 cobbler.ini 文件,以便 Ansible 知道 Cobbler 服务器的位置,并可以使用一些缓存改进。例如

[cobbler]

# Set Cobbler's hostname or IP address
host = http://127.0.0.1/cobbler_api

# API calls to Cobbler can be slow. For this reason, we cache the results of an API
# call. Set this to the path you want cache files to be written to. Two files
# will be written to this directory:
#   - ansible-cobbler.cache
#   - ansible-cobbler.index

cache_path = /tmp

# The number of seconds a cache file is considered valid. After this many
# seconds, a new API call will be made, and the cache file will be updated.

cache_max_age = 900

首先通过直接运行 /etc/ansible/cobbler.py 来测试脚本。你应该看到一些 JSON 数据输出,但它可能还什么都没有。

让我们探索一下它的作用。在 Cobbler 中,假设一个类似于以下场景的情况

cobbler profile add --name=webserver --distro=CentOS6-x86_64
cobbler profile edit --name=webserver --mgmt-classes="webserver" --ksmeta="a=2 b=3"
cobbler system edit --name=foo --dns-name="foo.example.com" --mgmt-classes="atlanta" --ksmeta="c=4"
cobbler system edit --name=bar --dns-name="bar.example.com" --mgmt-classes="atlanta" --ksmeta="c=5"

在上面的示例中,系统“foo.example.com”可以通过 Ansible 直接访问,但也可以在使用组名“webserver”或“atlanta”时访问。由于 Ansible 使用 SSH,它只通过“foo.example.com”与系统 foo 联系,绝不只通过“foo”。同样,如果你尝试“ansible foo”,它将找不到系统……但“ansible 'foo*'”会这样做,因为系统 DNS 名字以“foo”开头。

该脚本提供的不仅仅是主机和组信息。此外,作为奖励,当运行“setup”模块时(在使用剧本时自动发生),变量“a”、“b”和“c”将在模板中自动填充

# file: /srv/motd.j2
Welcome, I am templated with a value of a={{ a }}, b={{ b }}, and c={{ c }}

它可以像这样执行

ansible webserver -m setup
ansible webserver -m template -a "src=/tmp/motd.j2 dest=/etc/motd"

注意

名称“webserver”来自 Cobbler,配置文件中的变量也是如此。你仍然可以在 Ansible 中像往常一样传入你自己的变量,但来自外部清单脚本的变量将覆盖任何具有相同名称的变量。

因此,使用上面的模板(motd.j2),这会导致将以下数据写入系统“foo”的 /etc/motd

Welcome, I am templated with a value of a=2, b=3, and c=4

以及在系统“bar”(bar.example.com)上

Welcome, I am templated with a value of a=2, b=3, and c=5

从技术上讲,虽然没有很好的理由这样做,但它也能正常工作

ansible webserver -m ansible.builtin.shell -a "echo {{ a }}"

因此,换句话说,你也可以在参数/操作中使用这些变量。

其他清单脚本

在 Ansible 2.10 及更高版本中,清单脚本已移至其关联的集合。许多现在都在 ansible-community/contrib-scripts 存储库 中。我们建议你改用 清单插件

使用清单目录和多个清单源

如果在 Ansible 中给 -i 指定的位置是一个目录(或在 ansible.cfg 中如此配置),Ansible 可以在同一时间使用多个清单源。这样做时,可以在同一 Ansible 运行中混合使用动态和静态管理的清单源。即时混合云!

在清单目录中,可执行文件将被视为动态清单源,大多数其他文件将被视为静态源。以以下任何一种结尾的文件将被忽略

~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo

你可以在 ansible.cfg 中配置一个 inventory_ignore_extensions 列表,或设置 ANSIBLE_INVENTORY_IGNORE 环境变量来替换此列表。两种情况下的值都必须是逗号分隔的模式列表,如上所示。

清单目录中的任何 group_varshost_vars 子目录都按预期解释,这使得清单目录成为组织不同配置集的强大方式。有关更多信息,请参阅 传递多个清单源

动态组的静态组

在静态清单文件中定义组的组时,子组也必须在静态清单文件中定义,否则 Ansible 会返回错误。如果你想定义动态子组的静态组,请在静态清单文件中将动态组定义为空。例如

[tag_Name_staging_foo]

[tag_Name_staging_bar]

[staging:children]
tag_Name_staging_foo
tag_Name_staging_bar

另请参阅

如何构建你的清单

关于静态清单文件的所有内容

通信

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