生成清单¶
创建清单的脚本位于 inventory/dynamic_inventory.py,并安装到 ansible-runtime 虚拟环境中,名为 openstack-ansible-inventory。
本节解释了 Ansible 如何运行清单,以及如何手动运行它以查看其行为。
手动执行 dynamic_inventory.py 脚本¶
当运行 Ansible 命令(例如 ansible、ansible-playbook 或 openstack-ansible)时,Ansible 会自动执行 dynamic_inventory.py 脚本,并将其输出用作清单。
运行以下命令
# from the root folder of cloned OpenStack-Ansible repository
inventory/dynamic_inventory.py --config /etc/openstack_deploy/
动态清单脚本也安装在虚拟环境中作为脚本。因此,您还可以运行以下命令
source /opt/ansible-runtime/bin/activate
openstack-ansible-inventory --config /etc/openstack_deploy/
此调用在测试动态清单脚本的更改时很有用。
输入¶
openstack-ansible-inventory 接受 --config 参数,用于指定包含用于创建清单的配置的目录。如果未指定,则默认值为 /etc/openstack_deploy/。
除了此参数之外,基本环境骨架还位于 OpenStack-Ansible 代码库的 inventory/env.d 目录中。
如果在 --config 指定的目录中找到 env.d 目录,则其内容将被添加到基本环境中,并在发生冲突时覆盖任何先前的内容。
配置目录中必须存在以下文件
openstack_user_config.yml
此外,配置或环境可以分布在另外两个子目录中
conf.denv.d(用于环境自定义)
动态清单脚本执行以下操作
生成运行服务的每个容器的名称
创建容器和 IP 地址映射
将容器分配给物理主机
例如,考虑以下摘录 openstack_user_config.yml
identity_hosts:
infra01:
ip: 10.0.0.10
infra02:
ip: 10.0.0.11
infra03:
ip: 10.0.0.12
identity_hosts 字典定义了一个名为 identity_hosts 的 Ansible 清单组,其中包含三个基础架构主机。配置文件 inventory/env.d/keystone.yml 定义了部署到三个名为 *infra* 的主机的容器的附加 Ansible 清单组。
请注意,标记为 is_metal: true 的任何服务都将在分配的物理主机上运行,而不是在容器中运行。有关 is_metal: true 用法的示例,请参阅 inventory/env.d/cinder.yml 中的 container_skel 部分。
有关更多详细信息,请参阅 配置清单。
Outputs¶
执行后,脚本会将 openstack_inventory.json 文件输出到使用 --config 参数指定的目录中。这用作重复运行的事实依据。
警告
openstack_inventory.json 文件是环境的事实依据。在生产环境中删除此文件意味着容器名称的 UUID 部分将被重新生成,然后将创建新的容器。即使可以通过 SSH 访问,先前版本下生成的容器也将不再被 Ansible 识别。
相同的 JSON 结构会打印到 stdout,Ansible 会将其作为 playbook 的清单来使用。
检查清单配置是否存在错误¶
在运行 openstack-ansible-inventory 时使用 --check 标志将运行清单构建过程并查找已知错误,但不会将任何文件写入磁盘。
如果 openstack_user_config.yml 或 conf.d 文件中定义的任何组未在环境中找到,将引发警告。
此检查不会执行 YAML 语法验证,但如果存在无法解析的错误,则会失败。
写入调试日志¶
--debug/-d 参数允许写入详细的日志文件以调试清单脚本的行为。输出将写入当前工作目录中的 inventory.log。
inventory.log 文件将被追加,而不是覆盖。
与 --check 一样,此标志在从 ansible 运行时不会被调用。
使用 tox 运行¶
在某些情况下,您可能希望在更改 openstack_user_config.yml 或 env.d/conf.d 文件后在操作员本地机器上生成清单。鉴于您已经在这样的机器上拥有 openstack_deploy 目录,您可以在该目录中创建 tox.ini 文件,内容如下
[tox]
envlist = generate_inventory
[testenv]
skip_install = true
usedevelop = true
allowlist_externals =
bash
[testenv:generate_inventory]
basepython = python3
deps = -rhttps://opendev.org/openstack/openstack-ansible/raw/branch/master/requirements.txt
install_command =
pip install -c https://releases.openstack.org/constraints/upper/master {packages} -e git+https://opendev.org/openstack/openstack-ansible@master\#egg=openstack-ansible
commands =
openstack-ansible-inventory --config {toxinidir}/openstack_deploy
然后,您可以运行一个命令来使用 tox 生成清单
tox -e generate_inventory
结果,您的 openstack_user_config.json 将被更新。您也可以使用此方法来验证清单的有效性。