在执行环境中使用 Runner
注意
有关执行环境的通用技术概述以及如何通过几个简单步骤开始使用,请参阅 执行环境入门指南。
执行环境 (Execution Environments) 旨在提供一种一致、可复现、可移植且可共享的方法,使您在笔记本电脑上运行 Ansible 自动化任务的方式与在 Ansible AWX 中执行的方式完全相同。这有助于以可预测的方式开发旨在运行于 Ansible AWX 或通过 Red Hat Ansible Automation Platform 运行的自动化任务和 Ansible 内容。
更具体地说,在 Ansible Runner 的上下文中,执行环境 指的是通过 Ansible Runner 在 符合 OCI 标准的容器运行时 中,使用 符合 OCI 标准的容器镜像 来执行 Ansible 的容器运行时执行。该镜像恰当地捆绑了 Ansible Base、Ansible Collection 内容 以及支持这些内容所需的运行时依赖项。由 Ansible Builder 提供的构建工具有助于创建这些镜像。
在独立模式下运行 Ansible Runner 的所有方面(参见:将 Runner 作为独立命令行工具使用)在此同样适用,唯一的区别是进程隔离本质上是一个容器运行时(默认情况下为 podman)。
从受保护的镜像仓库使用执行环境
当运行一个使用来自私有/受保护镜像仓库的执行环境容器镜像的任务时,您需要首先对该仓库进行身份验证。
如果您通过 ansible-runner run 手动运行任务,先通过命令行使用 podman login 登录是一种身份验证方法。或者,创建一个包含 host、username 和 password 键的 container_auth_data 字典,并将其放入任务的 env/settings 文件中,是确保成功拉取受保护的执行环境容器镜像的另一种方式。请注意,这涉及在文件中列出敏感信息,且这些文件在任务运行完成后不会自动清理。
当通过 AWX 远程运行任务时,Ansible Runner 可以从用户提供的容器镜像仓库凭据 (Container Registry Credential) 中获取身份验证信息。凭据中的 host、username、password 和 verify_ssl 输入通过 container_auth_data 字典作为关键字参数传递到 json 文件中,该文件在任务运行结束时会被删除(即使任务被取消/中断),从而避免敏感信息留在任何可能持久化的任务相关文件中。
注意事项与考量
使用 Ansible Runner 与直接从命令行运行 Ansible 之间存在一些差异,主要涉及配置、内容本地化和机密数据。
机密信息
通常在 Ansible 中,您可以通过一系列机制提供机密数据,其中许多是可插件化且可配置的。然而,在使用 Ansible Runner 时,需要考虑某些特定因素;这些因素与 Ansible AWX 管理此类信息的方式类似。
有关更多信息,请参阅 Runner 输入目录层级结构
容器名称
与所有 ansible-runner 任务一样,每个任务都有一个与之关联的标识符,该标识符也是保存结果的 artifacts 子文件夹的名称。当启动用于任务隔离的容器时,它将被赋予一个名称 ansible_runner_<job identifier>。任务标识符中的某些字符可能会被替换为下划线,以兼容 Podman 和 Docker 允许的名称。
如果在稍后需要对容器运行命令(例如,在任务取消时停止容器),则会在内部使用此名称。
~/.ssh/ 符号链接
当使用 run_command() Python API 方法时,Ansible Runner 会自动将您的本地 SSH agent UNIX 域套接字 (SSH_AUTH_SOCK) 绑定挂载到容器运行时中。但是,如果您的 ~/.ssh/ 目录中的文件恰好符号链接到了另一个同样未挂载到容器运行时的目录,则此方法无效。为了解决这个问题,或者为了手动挂载您的 SSH 目录,您可以利用 CLI 选项 --container-volume-mount,或者 run_command()、run() 或 run_async() API 方法中的 container_volume_mounts API 参数。
这是一个作为符号链接的 ssh 配置文件示例
$ $ ls -l ~/.ssh/config
lrwxrwxrwx. 1 myuser myuser 34 Jul 15 19:27 /home/myuser/.ssh/config -> /home/myuser/dotfiles/ssh_config
$ ansible-runner run \
--container-volume-mount /home/myuser/dotfiles/:/home/myuser/dotfiles/ \
--process-isolation --process-isolation-executable podman \
/tmp/private --playbook my_playbook.yml -i my_inventory.ini