2015-07-14 16 views
7

Uno dei miei playbooks contiene un compito che installa i pacchetti Python di base:Ansible: installare più pacchetti Python su una singola sessione

--- 
    - 
    name: "Install Python packages: {{ python_packages_to_install }}" 
    sudo: true 
    pip: name={{ item }} 
    with_items: python_packages_to_install 

Con il seguente elenco di pacchetti:

- 
    include: python_basics.yaml 
    vars: 
    python_packages_to_install: 
     - virtualenv 
     - pss 
     - requests 
     - comment-builder 
     - boto 
     - ansible 
     - uwsgitop 
     - gitpull 
     - ipython 

attività di Works correttamente e installa i pacchetti:

TASK: [common | Install Python packages: ['virtualenv', 'pss', 'requests', 'comment-builder', 'boto', 'ansible', 'uwsgitop', 'gitpull', 'ipython']] *** 
ok: [push-prod-01] => (item=virtualenv) 
ok: [push-prod-01] => (item=pss) 
ok: [push-prod-01] => (item=requests) 
ok: [push-prod-01] => (item=comment-builder) 
ok: [push-prod-01] => (item=boto) 
ok: [push-prod-01] => (item=ansible) 
ok: [push-prod-01] => (item=uwsgitop) 
ok: [push-prod-01] => (item=gitpull) 
changed: [push-prod-01] => (item=ipython) 

Il problema è che ogni riga viene eseguita utilizzando un comando SSH consecutivo, invece di installare tutti i pacchetti in una singola chiamata.

C'è un modo per installare più pacchetti Python su un comando Ansible pip?

risposta

8

Ampliando la risposta di Ben, è anche possibile continuare a preservare la lista dei pacchetti come un elenco YAML come si deve, e fare la proiezione di un singolo valore quando si passa al modulo PIP come:

pip: name="{{ python_packages_to_install | join(' ') }}"

Mantiene il vostro playbook un po 'più gestibile ...

+0

ottengo un 'msg: questo modulo richiede chiave = valore argomenti ([ 'name = virtualenv', 'pss', 'richieste', 'Comment-builder ',' boto ',' ansible ',' uwsgitop ',' gitpull ',' ipython ']) '. Probabilmente c'è qualcosa di sbagliato nell'informare la lista. –

+0

È necessaria una coppia di preventivi: aggiornamento della risposta. –

+1

Oh sì, l'ho effettivamente testato con la sintassi del dizionario multilinea, ma lo ho schiacciato alla sintassi di scelta rapida per la risposta (che di solito non ha bisogno delle virgolette a meno che non ci siano spazi, a seconda della versione di Ansible). Grazie per la correzione. ;) – nitzmahone

3

A differenza del modulo Ansible apt, the pip module non accetta un elenco di pacchetti delimitato da virgole. Invece, è possibile fornire tutti i nomi dei pacchetti come una stringa spazio delimitato, utilizzando la sintassi == per specificare le versioni:

python_packages_to_install: "virtualenv==1.11.6 pss requests comment-builder boto ansible uwsgitop gitpull ipython" 

Se siete come me, può colpire come brutto e poco pratico da gestire. Un'alternativa è usare l'opzione requirements nel modulo pip per specificare un file dei requisiti. Ovviamente dovrai prima creare il file dei requisiti, probabilmente usando un modello.

Problemi correlati