如何在运行 Ansible 的 pip 模块时添加到 PATH?

Col*_*len 20 automation ansible

我正在尝试使用 Ansible 的pip模块将 psycopg2 安装到 Python virtualenv 中,但我需要在 PATH 前面添加一个条目才能正确构建(它需要知道包含 的目录的路径pg_config)。我看到我可以传递environmentpip模块,但我不确定如何添加而不是覆盖PATH

在这里,我试图在路径前面加上必要的目录,但它覆盖了 virtualenvPATH并失败了:

- pip:
    name: psycopg2
    virtualenv: /path/to/my/venv
  environment:
    PATH: /usr/pgsql-9.3/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

小智 36

如果您使用 Ansible 1.4 或更高版本(我推荐),您可以访问远程环境 PATH变量:

- pip: name=psycopg2 virtualenv=/path/to/my/venv
  environment:
    PATH: /usr/pgsql-9.3/bin:{{ ansible_env.PATH }}
Run Code Online (Sandbox Code Playgroud)

相反,如果您对运行 Ansible 脚本PATH本地客户端(而不是目标服务器)的env var感兴趣,那么您需要执行以下操作:

- pip: name=psycopg2 virtualenv=/path/to/my/venv
  environment:
    # This only makes sense if your client and server are homogeneous, that is,
    # they have the same PATHs.
    PATH: /usr/pgsql-9.3/bin:{{ lookup('env', 'PATH') }}
Run Code Online (Sandbox Code Playgroud)

  • `ansible_env.PATH` 选项正是我所需要的——完美运行。谢谢! (4认同)
  • 如果您需要添加`~/bin`,请使用`PATH: "{{ansible_env.HOME}}/bin:{{ansible_env.PATH}}"`。如果您改为使用 `PATH: "~/bin:{{ansible_env.PATH}}"`,那么某些程序(例如 Python 的 `shutil.which`)将无法使用该组件。 (4认同)
  • 还要注意,`ansible_env` 指的是 SSH 用户的环境,而不是 `sudo` 环境。`ansible_env.USER` 可能因此导致 `root` 而不是非特权用户。 (3认同)