第 20 章 执行环境
与旧的虚拟环境不同,执行环境是容器镜像,可以纳入系统级别的依赖项和基于集合的内容。每个执行环境都可让您有一个自定义镜像来运行作业,且仅在运行作业时需要什么。
20.1. 构建执行环境
如果您的 Ansible 内容依赖于自定义虚拟环境而不是默认环境,则必须执行额外的步骤。您必须在每个节点上安装软件包,并与主机系统上安装的其他软件进行正常交互,并使其保持同步。
要简化此过程,您可以构建作为 Ansible 控制节点 的容器镜像。https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#control-node这些容器镜像称为自动化执行环境,您可以使用 ansible-builder 创建。然后,ansible-runner 可以使用这些镜像。
20.1.1. 安装 ansible-builder
要构建镜像,您必须安装 Podman 或 Docker,以及 ansible-builder
Python 软件包。
--container-runtime
选项必须与您要使用的 Podman 或 Docker 可执行文件对应。
在构建执行环境镜像时,它必须支持部署 Ansible Automation Platform 的架构。
如需更多信息,请参阅 Ansible Builder 的 Quickstart,或 创建和使用执行环境。
20.1.2. 执行环境所需的内容
ansible-builder 用于创建执行环境。
执行环境必须包含:
- Ansible
- Ansible Runner
- Ansible Collections
Python 和系统依赖项:
- 集合中的模块或插件
- ansible-base 中的内容
- 自定义用户需要
构建新的执行环境涉及定义,该定义指定要包含在执行环境中的内容,如集合、Python 要求和系统级软件包。定义必须是 .yml 文件
从迁移到执行环境生成的输出中的内容有一些需要的数据,这些数据可以传送到文件或粘贴到此定义文件中。
其他资源
如需更多信息,请参阅 迁移旧的 venvs 到执行环境。如果您没有从虚拟环境迁移,您可以使用 执行环境设置参考 中描述的所需数据创建一个定义文件。
集合开发人员可以通过提供适当的元数据来声明其内容要求。
如需更多信息,请参阅 依赖项。
20.1.3. 构建镜像的 YAML 文件示例
ansible-builder build
命令将执行环境定义用作输入。它输出构建执行环境镜像所需的构建上下文,然后构建该镜像。镜像可以使用其他构建上下文重新构建,并生成相同的结果。默认情况下,构建器在当前目录中搜索名为 execution-environment.yml
的文件。
以下示例 execution-environment.yml
文件可用作起点:
--- version: 3 dependencies: galaxy: requirements.yml
requirements.yml
的内容:
--- collections: - name: awx.awx
要使用前面的文件构建执行环境,并运行以下命令:
ansible-builder build ... STEP 7: COMMIT my-awx-ee --> 09c930f5f6a 09c930f5f6ac329b7ddb321b144a029dbbfcc83bdfc77103968b7f6cdfc7bea2 Complete! The build context can be found at: context
除了生成随时可用的容器镜像外,构建上下文也会保留。这可以通过您选择的工具(如 docker build
或 podman build
)在不同时间或位置进行重建。
其他资源
如需有关 ansible-builder build
命令的更多信息,请参阅 Ansible 的 CLI 用法 文档。
20.1.4. 执行环境挂载选项
重建执行环境是添加证书的一种方式,但从主机继承证书提供了一种更方便的解决方案。对于基于虚拟机的安装,自动化控制器会在作业运行时会在执行环境中自动挂载系统信任存储。
您可以在 Paths 中自定义执行环境挂载选项和挂载路径,以公开给 Job Settings 页面的 isolated jobs 字段,其中支持 Podman 风格的卷挂载语法。
其他资源
如需更多信息,请参阅 Podman 文档。
20.1.4.1. 执行环境挂载选项故障排除
在某些情况下,由于自定义执行环境,/etc/ssh
decisions 文件被添加到执行环境镜像中,可能会出现 SSH 错误。例如,公开 /etc/ssh/ssh_config.d:/etc/ssh/ssh_config.d:O
路径可让容器被挂载,但所有权权限无法正确映射。
如果您满足这个错误,或者已从旧版本的自动化控制器升级,请使用以下步骤:
流程
-
将挂载卷上的容器所有权更改为
root
。 -
在导航面板中,选择
。 - 点 。
使用当前示例,在 Paths 中公开要公开给隔离的 jobs 字段的路径:
[ "/ssh_config:/etc/ssh/ssh_config.d/:0" ]
注意:O
选项只支持目录。尽可能详细,特别是在指定系统路径时。直接挂载/etc
或/usr
会影响到故障排除的难度。这会通知 Podman 运行类似以下示例的命令,其中挂载了配置,
ssh
命令可以正常工作:podman run -v /ssh_config:/etc/ssh/ssh_config.d/:O ...
要在 OpenShift 或 Kubernetes 容器中公开隔离路径为 HostPath,请使用以下配置:
[ "/mnt2:/mnt2", "/mnt3", "/mnt4:/mnt4:0" ]
将容器组的主机路径设置为 On 以启用它。
当 playbook 运行时,生成的 Pod 规格类似以下示例。请注意 volumeMounts
和 volumes
部分的详情。
20.1.4.2. 将执行节点中的目录挂载到执行环境容器中
在 Ansible Automation Platform 2.1.2 中,只有 O
和 z
选项可用。从 Ansible Automation Platform 2.2 开始,提供了其他选项,如 rw
。这在使用 NFS 存储时很有用。
流程
-
在导航面板中,选择
。 编辑 要向隔离的 jobs 字段公开 的路径:
- 输入卷从执行节点或混合节点挂载到容器的路径列表。
- 每行输入一个路径。
支持的格式为
HOST-DIR[:CONTAINER-DIR[:OPTIONS]
。允许的路径有z
、O
、ro
和rw
。Example
[ "/var/lib/awx/.ssh:/root/.ssh:O" ]
对于
rw
选项,请正确配置 SELinux 标签。例如,要挂载/foo
目录,请完成以下命令:sudo su
mkdir /foo
chmod 777 /foo
semanage fcontext -a -t container_file_t "/foo(/.*)?"
restorecon -vvFR /foo
awx
用户必须至少允许在这个目录中读取或写入。将权限设置为 777
。
其他资源
有关挂载卷的更多信息,请参阅 Podman 文档中的 podman-run (1)部分中的--volume 选项。