Question

Cela semble être qu'il doit être vraiment simple:

tasks:
- name: install python packages
  pip: name=${item} virtualenv=~/buildbot-env
  with_items: [ buildbot ]
- name: create buildbot master
  command: buildbot create-master ~/buildbot creates=~/buildbot/buildbot.tac

Toutefois, la commande ne réussira que si le virtualenv activer le script est source première, et il ne semble pas prévoir de le faire dans la Ansible module de commande.

J'ai expérimenté avec de sourcing activer le script dans plusieurs de .de profil, .bashrc, .bash_login, etc, avec pas de chance.Sinon, il y a la commande shell, mais il semble comme une sorte de maladroit hack:

- name: create buildbot master
  shell: source ~/buildbot-env/bin/activate && \
         buildbot create-master ~/buildbot \
         creates=~/buildbot/buildbot.tac executable=/bin/bash

Est-il un meilleur moyen?

Était-ce utile?

La solution

La meilleure façon consiste à utiliser le chemin complet de script installé - il fonctionnera automatiquement dans son virtualenv:

tasks:
- name: install python packages
  pip: name={{ item }} virtualenv={{ venv }}
  with_items: [ buildbot ]
- name: create buildbot master
  command: "{{ venv }}/bin/buildbot create-master ~/buildbot
            creates=~/buildbot/buildbot.tac"

Autres conseils

Ceci est une version généralisée de la méthode d'emballage.

venv_exec.j2:

#!/bin/bash
source {{ venv }}/bin/activate
$@

puis le jeu de jeu:

tasks:
  - pip: name={{ item }} virtualenv={{ venv }}
    with_items:
      - buildbot
  - template: src=venv_exec.j2 dest={{ venv }}/exec mode=755
  - command: "{{ venv }}/exec buildbot create-master {{ buildbot_master }}"

Voici un moyen d'activer le virtualenv pour une pièce entière;Cet exemple construit le Virtualenv en une seule lecture, puis commence à l'utiliser la suivante.

Je ne sais pas à quel point c'est propre, mais ça marche.Je construis juste un peu sur ce que Mikepurvis a mentionné ici.

---
# Build virtualenv
- hosts: all
vars:
  PROJECT_HOME: "/tmp/my_test_home"
  ansible_python_interpreter: "/usr/local/bin/python"
tasks:
  - name: "Create virtualenv"
    shell: virtualenv "{{ PROJECT_HOME }}/venv"
           creates="{{ PROJECT_HOME }}/venv/bin/activate"

  - name: "Copy virtualenv wrapper file"
    synchronize: src=pyvenv
                 dest="{{ PROJECT_HOME }}/venv/bin/pyvenv"

# Use virtualenv
- hosts: all
vars:
  PROJECT_HOME: "/tmp/my_test_home"
  ansible_python_interpreter: "/tmp/my_test_home/venv/bin/pyvenv"
tasks:
  - name: "Guard code, so we are more certain we are in a virtualenv"
    shell: echo $VIRTUAL_ENV
    register: command_result
    failed_when: command_result.stdout == ""

Fichier d'emballage PYENV:

#!/bin/bash
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/activate"
python $@

Exécutez simplement le pip Virtualenvs dans une coquille:

shell: ~/buildbot-env/pip install ${item}

fonctionne comme un charme.Je n'ai aucune idée de ce que fait le module PIP avec Virtualenvs, mais il semble assez inutile.

Comme je l'ai commenté ci-dessus, j'ai créer un script, disons qu'il est appelé buildbot.sh:

source ~/buildbot-env/bin/activate
buildbot create-master [and more stuff]

Ensuite l'exécuter sur la télécommande avec une tâche comme ceci:

- name: Create buildbot master
  script: buildbot.sh

Pour moi, cela semble encore inutile, mais peut-être plus propre que de l'exécuter dans un shell de commande.Votre playbook semble plus propre à le coût de ne pas voir immédiatement ce que fait le script.

Au moins certains modules ne semblent utiliser virtualenv, comme les deux django_manage et rax_clb déjà d'une fonction intégrée de virtualenv paramètre.Il peut ne pas être une grande étape pour Ansible pour inclure une commande en virtenv sorte de module.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top