如何为未连接的环境构建 Ansible 执行环境镜像
Ansible 执行环境 (EE)是在Ansible 自动化平台 2中引入的, 旨在为执行自动化作业提供定义明确、一致且可移植的环境。执行环境基本上是帮助执行 Ansible 剧本的Linux 容器映像。
在学习如何为无连接的离线环境构建执行环境映像之前,您需要了解一些执行环境基本概念。
执行环境组件
执行环境的容器镜像包含执行 Ansible 自动化作业所需的组件。这些组件包括 Python、Ansible (ansible-core)、Ansible Runner、所需的 Python 库和依赖项。
当您安装 Ansible 自动化平台时,无论您处于连接安装还是非连接安装,安装程序都会部署以下容器映像:
- 该
ee-29-rhel8
图像包含 Ansible 2.9,可与旧版 Ansible 剧本一起使用。 ee-minimal-rhel8
是具有 ansible-core 和基本集合的最小容器镜像。ee-supported-rhel8
是Red Hat支持的带有ansible-core和自动化内容集合的容器镜像。
使用 ansible-builder 创建自定义执行环境
Ansible 自动化平台的默认容器镜像让您无需任何额外配置即可开始执行自动化。如果您的自动化需要额外的库或插件,您可以构建自定义容器镜像并将其存储在任何受支持的容器注册表中,例如私有自动化中心。
您可以按照标准容器镜像构建流程来构建执行环境容器镜像,但 Ansible 自动化平台还包含一个名为的命令行实用程序,ansible-builder
用于为自定义执行环境构建容器镜像。该ansible-builder
工具可以从上游 Python 存储库或 Red Hat RPM 存储库安装:
## Install ansible-builder utility
$ pip3 install ansible-builder
## Ansible Automation Platform repository subscription is required
$ sudo dnf install ansible-builder
帮助ansible-builder
您使用定义文件构建容器镜像execution-environment.yml
。典型的execution-environment.yml
容器镜像包含基础容器镜像 ( EE_BASE_IMAGE
)、ansible.cfg
和其他依赖文件详细信息:
---
version: 1
build_arg_defaults:
EE_BASE_IMAGE: 'automationhub22-1.lab.local/ee-minimal-rhel8:latest'
ansible_config: 'ansible.cfg'
dependencies:
galaxy: requirements.yml
python: requirements.txt
additional_build_steps:
append:
- RUN microdnf install which
在上面的代码中,automationhub22-1.lab.local
是私有自动化中心,但您可以使用其他容器注册表源,例如registry.redhat.io或Quay.io。
准备好后execution-environment.yml
,执行ansible-builder build
命令来创建包含的构建上下文Containerfile
。
现在,创建容器:
$ ansible-builder build --tag my_custom_ee
Running command:
podman build -f context/Containerfile -t my_custom_ee context
Complete! The build context can be found at: /home/gmadappa/ansible-aap-demo/context
请参阅官方文档以了解有关使用构建容器镜像的更多信息ansible-builder
。
在未连接的环境中使用自定义执行环境
在某些情况下,自动化平台位于隔离环境或受限网络中,具有以下限制:
- 无法访问外部 Python 存储库或没有可用的内部 PyPI 存储库服务器
- 无法访问所需的 RPM 存储库
在这种情况下,您有两种选择来使用 Ansible 自动化平台构建和使用自定义执行环境:构建和传输容器映像或创建自定义环境。
1. 构建并传输容器镜像
您可以从连接的机器(例如,开发人员工作站)创建包含所有依赖项的容器映像,并将其传输到私有自动化中心(或另一个受支持的注册表)。
步骤 1.从连接的机器创建并存档容器映像:
## build the container image
$ ansible-builder build --tag my_custom_ee
## Save the container image as archive file
$ podman save --quiet -o my_custom_ee-1.0.tar localhost/my_custom_ee:1.0
第 2 步:使用安全文件传输、安全 USB 驱动器或其他可用方法将存档的容器映像(例如my_custom_ee-1.0.tar
)复制到目标未连接系统。
步骤 3.将 TAR 文件中的容器镜像加载到未联网的机器上的系统,并构建容器镜像:
$ podman load -i my_custom_ee-1.0.tar
步骤4.按照私有自动化中心的标记和推送流程进行操作。
2. 在无连接环境中创建自定义执行环境
传输依赖项后,您可以在未连接的机器内创建容器映像。
步骤 1.使用安全文件传输、安全 USB 驱动器或其他可用方法将依赖项传输到目标未连接系统。
例如,以下演示包含一个存档文件,其中包含我的自动化剧本和集合所需的 Python 库:
$ tar -tf python-packages.tar
python-packages/
python-packages/pan_os_python-1.7.3-py2.py3-none-any.whl
python-packages/ipaddress-1.0.23-py2.py3-none-any.whl
python-packages/requirements.txt
python-packages/pan_python-0.17.0-py2.py3-none-any.whl
第 2 步.按照说明准备Containerfile
构建执行环境的容器映像:
## Containerfile for custom execution environment
ARG EE_BASE_IMAGE=registry.redhat.io/ansible-automation-platform-22/ee-minimal-rhel8:latest
ARG EE_BUILDER_IMAGE=registry.redhat.io/ansible-automation-platform-22/ansible-builder-rhel8
FROM $EE_BASE_IMAGE
ADD ansible.cfg ansible.cfg
ADD python-packages.tar python
RUN python3 -m pip install -r python/python-packages/requirements.txt --find-links=python/python-packages/ --no-index
步骤 3.使用Podman构建容器镜像:
$ podman build -f Containerfile -t localhost/network-ee:1.0
[...]
Looking in links: python/python-packages/
Processing ./python/python-packages/pan_os_python-1.7.3-py2.py3-none-any.whl
Processing ./python/python-packages/pan_python-0.17.0-py2.py3-none-any.whl
Installing collected packages: pan-python, pan-os-python
[...]
Successfully tagged localhost/network-ee:1.0
01e210e05a60dcf49c1b4a2b1bf1e58c49a487823b585233a15d1ecd66910bab
TAR 文件被复制、提取,并且内容被安装在图像内。
步骤4.按照私有自动化中心的标记和推送流程进行操作。
我对这个过程做出了以下假设:
ee-minimal-rhel8:latest
和容器映像ansible-builder-rhel8
已在未连接的机器上(作为 Ansible 自动化平台部署的一部分安装或配置)。- 不涉及多阶段构建。
将容器镜像推送到私有自动化中心
您可以将容器镜像与其他默认执行环境镜像一起存储在 Ansible 的私有自动化中心中。
步骤 1.登录容器镜像仓库:
$ podman login automationhub22-1.lab.local
Username: pahadmin
Password:
Login Succeeded!
如果您在私有自动化中心节点上使用自签名安全套接字层 (SSL) 证书--tls-verify=false
,请通过在末尾添加选项来禁用 SSL 验证。
第 2 步.使用私有自动化中心路径标记本地容器镜像:
$ podman tag localhost/network-ee:1.0 \
automationhub22-1.lab.local/network-ee:1.0
步骤3.将图像推送到私有自动化中心(注册表):
$ podman push \
automationhub22-1.lab.local/network-ee:1.0
步骤 4.复制图像后,在私有自动化中心的图形用户界面上验证图像:
如果您不使用私有自动化中心,那么您需要使用前面提到的保存和加载方法手动将容器映像复制到所有自动化控制器节点。
请参阅官方文档,了解 如何在自动化控制器上的作业中使用执行环境。
建筑容器
您可以使用任何可能受支持的方法为执行环境构建容器镜像,并将其存储在受支持的容器注册表中。您还可以使用上游镜像(quay.io/ansible/ansible-runner:latest
和quay.io/ansible/ansible-builder:latest
),但仅社区支持构建自定义执行环境镜像。