为自动化构建和部署 Python 虚拟环境的功能已被 Ansible 执行环境替代。与旧的虚拟环境不同,执行环境是容器镜像,从而可以包含系统级别的依赖项和基于集合的内容。每个执行环境都允许您具有自定义镜像来运行作业,每个环境都只包含运行作业时所需的内容。
使用依赖于非默认依赖项(自定义虚拟环境)的 Ansible 内容可能会比较棘手。软件包必须在每个节点上安装,并需要可以与主机系统上安装的其他软件一同正常操作,并保持同步。以前,在默认情况下,作业会在 /var/lib/awx/venv/ansible
的一个虚拟环境中运行,它会预加载 ansible-runner 的依赖项,以及 Ansible 控制机器使用的某些 Ansible 内容类型。
为了简化这个过程,容器镜像可以通过 Ansible 构建 control nodes。这些容器镜像称为自动化 execution environments,您可以使用 ansible-builder 创建,然后 ansible-runner 可以利用这些镜像。
要构建镜像,需要安装 podman 或 docker,以及 ansible-builder Python 软件包。--container-runtime
选项需要与您要使用的 Podman/Docker 可执行文件对应。
从 PyPi 安装:
$ pip install ansible-builder
从主线的开发分支中安装:
$ pip install https://github.com/ansible/ansible-builder/archive/devel.zip
要从特定的标签或分支安装,请替换以下示例中的 <ref>
:
$ pip install https://github.com/ansible/ansible-builder/archive/<ref>.zip
ansible-builder 用于创建 execution environment。
execution environment 应该包含:
Ansible
Ansible Runner
Ansible Collections
Python 和/或系统依赖项:
集合中的模块/插件
ansible-base 中的内容
自定义用户需要
构建新的 execution environment 涉及定义(一个 .yml
文件),用于指定您要包含在 execution environment 中的内容,如集合、Python 要求和系统级软件包。在迁移到 execution environments 时生成的输出中包括一些所需的数据,这些数据可以传送到一个文件中或粘贴到定义文件中。相关详情请参阅 将旧的 venv 迁移到 execution environments。如果您不是通过虚拟环境进行迁移,您可以参照 Execution environment 定义 使用所需数据创建一个定义文件。
集合开发人员可以通过提供适当的元数据来声明其内容要求。如需更多信息,请参阅 集合级元数据。
创建定义后,使用此流程构建 execution environment。
ansible-builder build
命令将 execution environment 定义用作输入。它输出构建 execution environment 镜像所需的构建上下文,并继续进行构建该镜像。镜像可以使用其他构建上下文重新构建,并生成相同的结果。默认情况下,它会在当前目录中查找名为 execution-environment.yml
的文件。
为了说明这一点,可以使用以下示例 execution-environment.yml
文件作为一个起点:
---
version: 1
dependencies:
galaxy: requirements.yml
requirements.yml
的内容:
---
collections:
- name: awx.awx
要使用上述文件构建 execution environment,请运行:
$ ansible-builder build
...
STEP 7: COMMIT my-awx-ee
--> 09c930f5f6a
09c930f5f6ac329b7ddb321b144a029dbbfcc83bdfc77103968b7f6cdfc7bea2
Complete! The build context can be found at: context
除了生成随时可用的容器镜像外,构建上下文也会保留,它可以通过您选择的工具在不同的时间和/或位置进行重建,如 docker build
或 podman build
。
根据 execution environment 已被设置为全局使用,还是只与某个机构关联,您需要具有适当的管理员权限级别才能在作业中使用 execution environment。与机构相关联的 Execution environments 需要机构管理员权限才可以使用这些 execution environments 运行作业。
要在作业中使用 execution environment,您必须已使用 ansible-builder 创建了一个。详情请查看 构建一个 execution environment。当一个 execution environment 被创建后,您可以使用它来运行作业。使用 automation controller 用户界面指定作业模板中使用的 execution environment。
注解
在运行使用已分配了一个凭证的 execution environment 的作业或作业模板前,请确定凭证包含用户名、主机和密码。
从左侧导航栏中点 Execution Environments。
选择 Add 按钮来添加 execution environment。
在以下字段中输入相关信息:
Name:为 execution environment 输入一个名称(必需)。
Image:输入镜像名称(必需)。镜像名称需要其完整位置(存储库)、registry、镜像名称和版本标签,其示例格式为 quay.io/ansible/awx-ee:latestrepo/project/image-name:tag
。
Job Type:(可选)在运行作业时选择拉取类型:
Always pull container before running:为容器拉取最新的镜像文件。
No pull option has been selected:没有指定拉取。
Never pull container before running:永不拉取容器镜像的最新版本。
Description:可选。
Organization:可选地分配机构来特定地使用这个 execution environment。要使 execution environment 可用于多个机构,请将此字段留空。
Registry credential:如果镜像有一个受保护的容器 registry,提供访问它的凭证。
点 Save。
现在,您新添加的 execution environment 已准备好在作业模板中使用。 要将 execution environment 添加到作业模板中,在作业模板的 Execution Environment 字段中指定它,如下例所示。 有关设置作业模板的详情,请参考 Automation Controller User Guide 中的 作业模板。
将 execution environment 添加到作业模板后,您可以看到在 execution environment 的 Templates 标签页中列出的模板:
重建 execution environment 是添加证书的一个的方法,但从主机继承证书提供了一种更加方便的解决方案。对于基于虚拟机的安装,控制器会在作业运行时自动将系统信任存储挂载到 execution environment 中。
另外,您可以在作业设置页面的 Paths 中自定义 |ee| 挂载选项和挂载路径,以公开给隔离的 jobs 字段,其中支持 podman 风格的卷挂载语法。详情请参阅 Podman documentation。
在某些情况下,如果因为自定义了一个 execution environment 而导致 /etc/ssh/*
文件添加到 execution environment 镜像,则可能会出现 SSH 错误。例如,公开 /etc/ssh/ssh_config.d:/etc/ssh/ssh_config.d:O
路径允许挂载容器,但所有权权限无法正确映射。
如果您遇到这个错误,或者已从旧版本控制器(如 3.8.x)升级,请执行以下步骤:
将挂载卷上的容器所有权改为 root
。
使用当前示例,在 Paths to expose to isolated jobs 字段中,使用当前示例公开路径,如下所示:
注解
:O
选项只支持目录。强烈建议您尽可能具体,特别是在指定系统路径时。直接挂载 /etc
或 /usr
会使难以进行排除故障。
这代表 podman 运行类似以下示例的命令,其中挂载了配置,ssh
命令可以正常工作。
podman run -v /ssh_config:/etc/ssh/ssh_config.d/:O ...
要在 OpenShift 或 Kubernetes 容器中公开隔离路径为 HostPath,请假定以下配置:
使用 Expose host paths for Container Groups 切换来启用它。
当 playbook 运行时,生成的 Pod 规格将显示类似以下示例。请注意 volumeMounts
和 volumes
部分的详细信息。