【问题标题】:Shouldn't virtualenv be used on Ansible target nodes?不应该在 Ansible 目标节点上使用 virtualenv 吗?
【发布时间】:2021-08-26 01:32:21
【问题描述】:

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

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

警告:以 root 身份运行 pip 会破坏包和权限。您应该使用 venv 可靠地安装软件包:https://pip.pypa.io/warnings/venv

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

  • 构建必不可少
  • python3-dev
  • python3-wheel
  • libsasl2-dev
  • libldap2-dev
  • libssl 开发

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

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

【问题讨论】:

    标签: python pip ansible virtualenv


    【解决方案1】:

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

    在任何 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 可能是对大多数用户来说效果最好的方式,而“高级用户”仍然可以通过一些额外的操作来实现他们想要的。

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多