Ansible: installieren mehrerer Python-Pakete auf einer einzigen Sitzung
Einer meiner playbooks enthält eine Aufgabe, die installiert basic-Python-Pakete:
---
-
name: "Install Python packages: {{ python_packages_to_install }}"
sudo: true
pip: name={{ item }}
with_items: python_packages_to_install
Mit der folgenden Liste der Pakete:
-
include: python_basics.yaml
vars:
python_packages_to_install:
- virtualenv
- pss
- requests
- comment-builder
- boto
- ansible
- uwsgitop
- gitpull
- ipython
Die Aufgabe korrekt funktioniert und installiert die Pakete:
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)
Das problem ist, dass jede Zeile ausgeführt wird, mit einer aufeinander folgenden SSH-Befehl, anstelle der Installation alle Pakete in einem einzigen Aufruf.
Gibt es eine Möglichkeit zum installieren mehrerer Python-Paketen auf einem Ansible pip
Befehl?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erweiterung auf Ben ' s Antwort, Sie können auch weiterhin zu erhalten die Paket-Liste als yaml-Liste, wie Sie es haben, und tun die Projektion auf einen einzelnen Wert, wenn Sie übergeben es an die pip-Modul wie:
pip: name="{{ python_packages_to_install | join(' ') }}"
Hält das playbook ein wenig mehr wartbar...
msg: this module requires key=value arguments (['name=virtualenv', 'pss', 'requests', 'comment-builder', 'boto', 'ansible', 'uwsgitop', 'gitpull', 'ipython'])
. Etwas ist wohl falsch mit stringifying der Liste.fatal: [localhost]: FAILED! => { "changed": false, "cmd": [ "/usr/local/bin/pip2", "install", "openshift==0.8.4 boto3==1.5.20 botocore==1.8.50" ]
. Problem ist, dasspip
erhält ein einziges argument, mit alle 3 Paketen, eher als ein argument pro Paket. Die Verwendung einer Schleife, anstatt vielleicht ein bisschen langsamer, aber mehr wahrscheinlich, um zu arbeiten.Im Gegensatz zu Ansible
apt
Modul, diepip
- Modul nicht akzeptieren, wird eine durch Komma getrennte Liste von Paketen. Stattdessen, Sie können alle package-Namen als eine durch Leerzeichen getrennte Zeichenfolge mit den==
syntax festlegen Versionen:Wenn Sie wie ich es kann schlagen Sie als hässlich und unpraktisch zu handhaben. Eine alternative ist die Nutzung der
requirements
option der pip-Modul, um anzugeben, ob ein Bedarf an einer Datei. Natürlich müssen Sie die Anforderungen der Datei, die erste, wahrscheinlich mit einer Vorlage.