2013-12-13 6 views
7

Esiste un modo migliore per eseguire ansible all'interno di una virtualenv sulle macchine remote?Il modo migliore per eseguire sempre ansible all'interno di una virtualenv su macchine remote?

Finora il modo in cui posso vedere è modificare il file .bashrc, manualmente o con ansible stesso.

Ad esempio:

tasks: 
    - name: "Enable virtualenv in .bashrc" 
     lineinfile: dest=.bashrc 
        line="source {{ PROJECT_HOME }}/venv/bin/activate" 

    # 
    # Put tasks that rely on this precondition here (?) 
    # 

    # Optionally, disable this later on 
    - name: "Disable virtualenv in .bashrc" 
     lineinfile: dest=.bashrc 
        line="source {{ PROJECT_HOME }}/venv/bin/activate" 
        state=absent 

TODO: Controllare se i modi in cui potrebbe essere fatto utilizzando ssh autorizzato tasti: http://binblog.info/2008/10/20/openssh-going-flexible-with-forced-commands/

risposta

3

Ecco un modo per abilitare il virtualenv per un intero gioco; questo esempio costruisce il virtualenv in un gioco, quindi inizia a usarlo il prossimo.

Non sono sicuro di quanto sia pulito, ma funziona. Sto solo costruendo un po 'su ciò che mikepurvis ha menzionato qui.

--- 
# 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 == "" 

pyenv file di avvolgitore:

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

bella soluzione - presumibilmente i compiti "reali" andare dopo i compiti codice guardia. Penso che la parte "file pyenv wrapper" alla fine abbia un errore di battitura nel nome - dovrebbe essere 'pyvenv' per abbinare i compiti di Ansible. Anche le citazioni di shell annidate senza escape in quello script sembrano un po 'strane, ma finché funziona ... – RichVel

Problemi correlati