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。
您可以在 Tower 中指定一个不同的 virtualenv 用于运行作业模板。为此,您必须指定这些 venvs 所在的目录。您可以选择将自定义 venvs 保留在 /var/lib/awx/venv/
中,但强烈建议创建一个自定义目录。以下示例使用占位符目录 /opt/my-envs/
,但您可以将其替换为在指定此目录时选择的目录路径。
准备新的自定义 virtualenv 需要预先安装 virtualenv 包
$ sudo yum install python-virtualenv
为您的自定义 venvs 创建一个目录
$ sudo mkdir /opt/my-envs
确保为您的目录提供适当的写入权限、执行权限和所有权
$ sudo chmod 0755 /opt/my-envs
$ sudo chown awx:awx /opt/my-envs
可以选择通过将此目录添加到 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'
现在已经设置了 venv 目录,请在该位置创建一个虚拟环境
$ sudo virtualenv /opt/my-envs/custom-venv
注意
支持多个版本的 Python,但 Python 3 中创建 virtualenvs 的语法略有不同: $ sudo python3 -m venv /opt/my-envs/custom-venv
接下来,安装 gcc 以便可以编译 psutil
$ yum install gcc
需要 Python 头文件来编译 psutil
。在 RHEL 8 系统上成功编译 psutil 所需的包是 platform-python-devel
$ yum install platform-python-devel
您新创建的 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 部署和配置 部分。
创建自定义 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,如以下示例所示
启动作业模板时,您还将在作业详细信息窗格中看到指定的 virtualenv