Comment puis-je ajouter à PATH lors de l'exécution du module pip d'Ansible?

17

J'essaie d'installer psycopg2 dans un virtualenv Python avec le pipmodule d'Ansible , mais je dois ajouter une entrée à PATH pour qu'il se construise correctement (il doit connaître le chemin d'accès au répertoire contenant pg_config). Je vois que je peux passer environmentau pipmodule, mais je ne suis pas sûr de la manière de préfixer plutôt que d'écraser PATH.

Ici, j'essaie d'ajouter le chemin avec le répertoire nécessaire, mais il écrase le virtualenv PATHet échoue:

- pip:
    name: psycopg2
    virtualenv: /path/to/my/venv
  environment:
    PATH: /usr/pgsql-9.3/bin:$PATH
Collin Allen
la source

Réponses:

33

Si vous utilisez Ansible 1.4 ou une version ultérieure (que je recommande), vous pouvez accéder à la variable env distante PATH :

- pip: name=psycopg2 virtualenv=/path/to/my/venv
  environment:
    PATH: /usr/pgsql-9.3/bin:{{ ansible_env.PATH }}

Si, à la place, vous êtes intéressé par la PATHvariable env du client local exécutant les scripts Ansible (au lieu du serveur cible ), vous souhaitez effectuer les opérations suivantes:

- 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') }}
Rico
la source
4
L' ansible_env.PATHoption était ce dont j'avais besoin - fonctionnait parfaitement. Merci!
Collin Allen
1
Notez que cela prend le CHEMIN de la station de travail, pas le serveur!
vdboor
4
Si vous devez ajouter un préfixe ~/bin, utilisez PATH: "{{ansible_env.HOME}}/bin:{{ansible_env.PATH}}". Si vous utilisez à la place PATH: "~/bin:{{ansible_env.PATH}}", certains programmes (tels que Python shutil.which) ne peuvent pas utiliser ce composant.
Lekensteyn du
3
Soyez également conscient que cela ansible_envfait référence à l'environnement de l'utilisateur SSH, pas à l' sudoenvironnement. ansible_env.USERpeut donc entraîner rootplutôt qu'un utilisateur non privilégié.
Lekensteyn du