文档

4. 导入清单文件

Tower 允许您从源代码管理中选择一个清单文件,而不是从头开始创建一个。此功能与自定义清单脚本相同,只是内容是从源代码管理中获取的,而不是在浏览器中编辑其内容。这意味着文件是不可编辑的,并且随着清单在源代码中更新,项目中的清单也会相应更新,包括与它们关联的 group_varshost_vars 文件或目录。SCM 类型可以同时使用清单文件和脚本,清单文件和自定义类型之间的重叠在于它们都执行脚本。

4.1. 自定义动态清单脚本

可以导入并运行存储在版本控制中的自定义动态清单脚本。这使得更改清单脚本变得容易得多 - 不必将清单脚本复制粘贴到 Tower 中,而是直接从源代码管理中提取并执行。脚本必须编写为处理执行其工作所需的任何凭据,您还需负责安装脚本所需的任何 Python 库(这与自定义动态清单脚本的要求相同)。这适用于用户定义的清单源脚本和 SCM 源,因为它们都暴露于与剧本相关的 Ansible virtualenv 要求。

您可以在编辑 SCM 清单源本身时指定环境变量。对于某些脚本,这将足够,但是,这不是存储提供对云提供商或清单访问的秘密信息的安全方法。

更好的方法是为要使用的清单脚本创建一个新的凭据类型。凭据类型需要指定所有必要的输入类型。然后,当您创建这种类型的凭据时,秘密将以加密形式存储。如果您将该凭据应用于清单源,则脚本将能够像环境变量或文件一样访问这些输入。

有关详细信息,请参阅 凭据类型

4.1.1. 项目更新时更新

如果清单源包含静态内容,则可能希望在源项目的 SHA-1 哈希值发生变化时自动更新其内容。这可以通过将清单源配置为“项目更新时更新”来实现。

_images/sourced-from-project-update-on-project-update.png

选中此框后,清单源将不允许“启动时更新”。“启动时更新”很重要,因为某些配置需要它。例如,当您设置一个清单引用的项目,以便在作业模板运行之前按顺序更新,以便作业模板运行的清单将具有该清单的更新形式。但是,还有两种其他方法可以实现此目的

  • 您可以创建一个使用项目以及从同一项目更新的清单的作业模板。在这种情况下,您可以将项目设置为 update_on_launch,在这种情况下,它将在需要时触发清单更新。

  • 如果您必须对 playbook 使用与清单源不同的项目,那么您仍然可以将项目放在工作流中,然后在项目更新成功后运行作业模板。

这保证了清单更新“及时”(意味着清单更改在作业模板启动之前完成),因为只有在清单更新完成后,项目才会过渡到已完成状态。

注意

清单更新失败不会将项目标记为失败。此外,并非所有项目更新都会触发相应的清单更新。如果项目修订版未更改且清单未编辑,则清单更新将不会执行。

此外,在相关作业正在运行时,项目不会被阻止更新。在您拥有大型项目(约 10 GB)的情况下,/tmp 上的磁盘空间可能会成为问题。

4.2. SCM 清单源字段

使用的源字段是

  • source_project:要使用的项目

  • source_path:项目内部的相对路径,指示目录或文件。如果留空,“” 仍然是一个相对路径,指示项目的根目录

  • source_vars: 如果在“文件”类型清单源上设置,它们将在运行时传递到环境变量。

项目的更新会自动触发使用该项目的清单更新。清单源创建后,立即安排项目更新。在相关作业运行时,清单或项目更新都不会被阻止。在项目规模较大(约 10 GB)的情况下,/tmp 上的磁盘空间可能会成为问题。

您可以在 Tower 用户界面中从“创建清单源”页面手动指定位置。有关创建清单源的说明,请参阅Ansible Tower 用户指南清单部分。

此列表应在项目更新时刷新到最新的 SCM 信息。如果没有任何清单源将项目用作 SCM 清单源,则清单列表可能不会在更新时刷新。

对于具有 SCM 源的清单,清单更新的作业详细信息页面显示项目更新的状态指示器以及项目的名称。状态指示器链接到项目更新作业。项目名称链接到项目。

_images/jobs-details-scm-sourced-inventories.png

在相关作业运行时可以执行清单更新。

4.2.1. 支持的文件语法

Ansible Tower 使用 Ansible 中的 ansible-inventory 模块来处理清单文件,并支持 Tower 所需的所有有效清单语法。