文档

4. 使用 virtualenv 与 Ansible Tower

Virtualenv 创建隔离的 Python 环境,以避免因冲突的依赖项和不同的版本而导致的问题。Virtualenv 的工作原理是简单地创建一个包含特定 Python 版本所需的所有可执行文件和依赖项的文件夹。Ansible Tower 在安装期间创建两个 virtualenvs——一个用于运行 Tower,另一个用于运行 Ansible。这允许 Tower 在稳定环境中运行,同时允许您根据需要向 Ansible Python 环境添加或更新模块以运行您的剧本。有关 virtualenv 的更多信息,请参阅 Python 指南中的 虚拟环境Python virtualenv 项目本身。

默认情况下,virtualenv 位于文件系统的 /var/lib/awx/venv/ansible,但您可以创建自己的自定义目录并在清单导入中使用它们。这使您可以选择如何运行清单导入,因为清单来源使用自定义虚拟环境。

Tower 还预先安装了各种第三方库/SDK 支持到此 virtualenv 中,用于其与各种云提供商(如 EC2、OpenStack、Azure 等)的集成点。定期,您可能需要在此 virtualenv 中添加额外的 SDK 支持,将在下面进一步详细介绍。

注意

强烈建议您在安装任何软件包到虚拟环境之前运行 umask 0022。未正确配置权限会导致 Tower 服务故障。以下是一个示例

# source /var/lib/awx/venv/ansible/bin/activate
# umask 0022
# pip install --upgrade pywinrm
# deactivate

除了向 Tower 用于运行 Ansible 的 virtualenv 添加模块外,您还可以创建如下所述的新 virtualenvs。

4.1. 准备新的自定义 virtualenv

您可以在 Tower 中指定一个不同的 virtualenv 用于运行作业模板。为此,您必须指定这些 venvs 所在的目录。您可以选择将自定义 venvs 保留在 /var/lib/awx/venv/ 中,但强烈建议创建一个自定义目录。以下示例使用占位符目录 /opt/my-envs/,但您可以将其替换为在指定此目录时选择的目录路径。

  1. 准备新的自定义 virtualenv 需要预先安装 virtualenv 包

$ sudo yum install python-virtualenv
  1. 为您的自定义 venvs 创建一个目录

$ sudo mkdir /opt/my-envs
  1. 确保为您的目录提供适当的写入权限、执行权限和所有权

$ sudo chmod 0755 /opt/my-envs
$ sudo chown awx:awx /opt/my-envs
  1. 可以选择通过将此目录添加到 CUSTOM_VENV_PATHS 设置中,在 Tower 中指定要查找自定义 venvs 的目录,如下所示

$ curl -X PATCH 'https://user:[email protected]/api/v2/settings/system/' \
    -d '{"CUSTOM_VENV_PATHS": ["/opt/my-envs/"]}'  -H 'Content-Type:application/json'

如果您在多个目录中跨越了 venvs,请添加所有路径,Tower 将从这些路径中聚合 venvs

$ curl -X PATCH 'https://user:[email protected]/api/v2/settings/system/' \
    -d '{"CUSTOM_VENV_PATHS": ["/path/1/to/venv/", "/path/2/to/venv/", "/path/3/to/venv/"]}' \
    -H 'Content-Type:application/json'
  1. 现在已经设置了 venv 目录,请在该位置创建一个虚拟环境

$ sudo virtualenv /opt/my-envs/custom-venv

注意

支持多个版本的 Python,但 Python 3 中创建 virtualenvs 的语法略有不同: $ sudo python3 -m venv /opt/my-envs/custom-venv

  1. 接下来,安装 gcc 以便可以编译 psutil

$ yum install gcc
  1. 需要 Python 头文件来编译 psutil。在 RHEL 8 系统上成功编译 psutil 所需的包是 platform-python-devel

$ yum install platform-python-devel
  1. 您新创建的 virtualenv 需要一些基础依赖项才能正确运行剧本(例如,事实收集)

$ sudo /opt/my-envs/custom-venv/bin/pip install psutil

从这里,您可以安装您关心的其他 Python 依赖项,例如每个 virtualenv 版本的 Ansible 本身

$ sudo /opt/my-envs/custom-venv/bin/pip install -U "ansible == X.Y.Z"

或者,您可以添加一个不在基础 Tower 安装中包含的额外第三方 SDK

$ sudo /opt/my-envs/custom-venv/bin/pip install -U python-digitalocean

如果您想复制它们,可以使用 pip freeze 找到 Tower 默认 virtualenv 中包含的库

$ sudo /var/lib/awx/venv/ansible/bin/pip freeze

在集群化的 Tower 安装中,您需要确保相同的自定义 virtualenv 存在于 /opt/my-envs/每个本地文件系统上。自定义 virtualenvs 支持在隔离实例上。如果您使用的是自定义虚拟环境,则还需要将其复制或复制到您将使用的任何隔离节点上,而不仅仅是 Tower 节点。有关在容器中设置自定义虚拟环境的信息,请参阅Ansible Tower 管理指南OpenShift 部署和配置 部分。

4.2. 分配自定义 virtualenvs

创建自定义 virtualenv 后,您可以在组织、项目或作业模板级别将其分配以在作业运行中使用它。您可以在清单来源上设置自定义 venv 以在该 venv 中运行清单更新。使用该清单的作业遵循其自身的规则,不会使用此 venv。如果 SCM 清单来源没有选择 venv,它可以使用其链接项目的 venv。您可以在组织上分配自定义 venv,但如果您这样做,它不会被组织中的清单更新使用,因为它仅在作业运行中使用。

以下显示了在所需级别分配自定义 venv 的正确方法。

PATCH https://awx-host.example.org/api/v2/organizations/N/
PATCH https://awx-host.example.org/api/v2/projects/N/
PATCH https://awx-host.example.org/api/v2/job_templates/N/
PATCH https://awx-host.example.org/api/v2/inventory_sources/N/

Content-Type: application/json
{
        'custom_virtualenv': '/opt/my-envs/custom-venv'
}

/api/v2/config/ 的 HTTP GET 请求提供已检测到的已安装 virtualenvs 列表

{
        "custom_virtualenvs": [
                "/opt/my-envs/custom-venv",
                "/opt/my-envs/my-other-custom-venv",
        ],
...
}

您还可以从 Ansible Tower 用户界面中各自的编辑屏幕指定要分配给组织、项目和作业模板的虚拟环境。从Ansible 环境下拉菜单中选择 virtualenv,如以下示例所示

_images/organizations-ansible-env-virtualenv-list.png

启动作业模板时,您还将在作业详细信息窗格中看到指定的 virtualenv

_images/jobs-show-job-details-venv.png