不应该在 Ansible 目标节点上使用 virtualenv 吗?

Shouldn't virtualenv be used on Ansible target nodes?

在大多数情况下,我认为 Ansible 工程师安装 pip 包 1) 不使用 virtualenv 和 2) 在 root 下。

如果我们手动执行此操作,我们会看到警告

WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv

通常当我们的 Ansible 自动化变得更高级时,我们将需要额外的 pip 包来使 Ansible 模块工作。通常这还需要安装额外的 OS 包。例如,python-ldap pip 包在 Ubuntu 18.04 上需要

通过以 root 身份安装额外的 pip 包来使 Ansible 在目标节点上工作的方式,而这显然不是推荐的使用方式 Python 和 Pip 让我想知道是否没有更好的方法这样做。

我们不应该使用 virtualenv 和其他帐户而不是 root 来为 Ansible 安装 pip 吗?

这可能有多个方面。我首先想到的是:

在任何 venv 之外使用“全局”python,对于绝大多数用户来说可能会很好地工作,而如果您不熟悉,使用 venv 可能会导致各种意外行为有了概念。
例如,如果默认使用 venv,人们会安装 python 包,然后想知道为什么 python 在尝试将它们导入主机上的 python 时声称它们不可用。

另一方面,如果您想这样做,使用 venv 可能相对容易。在任何剧本中,您都可以创建 venv,然后只需更新 ansible_python_interpreter 变量:

- pip:
    name: pip
    virtualenv: /path/to/venv

- set_fact:
    ansible_python_interpreter: /path/to/venv/bin/python

- setup:

免责声明:我只是很快尝试了一下,发现它有效,所以在某些情况下可能会出现故障。

显然,在每一个剧本中都添加这样的东西并不是很整洁,但可以做得更好,例如通过在第一个设置中创建 venv,然后在 ansible.cfg.

中使用 interpreter_python

tl;博士:
使用全局 python 可能是对大多数用户来说最有效的方式,而“高级用户”仍然可以通过一些额外的操作来实现他们想要的。