Documentation

4. 使用 Ansible Tower 的 virtualenv

Virtualenv 会创建相互隔离的 Python 环境以避免因为冲突的依赖软件包和不同版本造成的问题。Virtualenv 会被每个特定的 Python 版本创建一个单独的目录来包括所有需要的可执行代码和依赖软件包。Ansible Tower 在安装时创建两个 virtualenvs,一个用于运行 Tower,另外一个用于运行 Ansible。这样,Tower 就可以在一个稳定的环境中运行,而您可以根据运行 playbook 的需要在 Ansible Python 环境中增加或更新模块。如需了解更新信息,请参阅 Python 指南中的 Virtual EnvironmentsPython virtualenv 项目。

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

Tower 还预安装了各种第三方库/SDK 支持,用于与各种云供应商(如 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 中添加模块外,您还可以创建新的 virtualenv,如下所述。

4.1. 准备新的自定义 virtualenv

您可以指定一个不同的 virtualenv 用于在 Tower 中运行作业(Job)模板。您需要指定该这些 venv 所在的目录。您可以选择把自定义 venv 存放在``/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. 另外,您还可以在 Tower 中指定要查找自定义 venvs 的目录,方法是将这个目录添加到 CUSTOM_VENV_PATHS 设置中,如下:

$ 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 将聚合来自它们的 venv:

$ 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 中创建 virtualenv 的语法稍有变化: $ sudo python3 -m venv /opt/my-envs/custom-venv

  1. 下一步,安装 gcc 以便 psutil 可以被编译:

$ yum install gcc
  1. 您新创建的 virtualenv 需要一些基本的依赖项来正确运行 playbook(例如,事实 (fact) 收集):

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

在这里,您可以安装 additional 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 节点上。如需了解在容器中设置自定义虚拟环境的信息,请参考|ata| 中的 Build custom virtual environments 部分。

4.2. 分配自定义 virtualenv

在创建了自定义 virtualenv 后,您可以在 Organization 、Project 或 Job Template 级别上分配它以在作业运行时使用它。您可以在清单(inventory)源中设置自定义 venv 以在这个 venv 中运行清单更新。使用该清单的作业遵循自己的规则,且不会使用这个 venv。如果 SCM 清单源没有选择一个 venv,它可以使用与之连接的目录的 venv。您可以在机构(organization)中分配一个自定义 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 用户界面中的相应页,为 Organization、Project 和 Job Template 指定分配的虚拟环境。从 Ansible Environment 下拉菜单中选择 virtualenv,如以下示例所示:

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

启动作业模板时,您还会看到在作业详情框中指定的 virtualenv:

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