Ansible: installer plusieurs paquets Python sur une seule session
Un de mes tablettes playbook contient une tâche qui s'installe de base paquets Python:
---
-
name: "Install Python packages: {{ python_packages_to_install }}"
sudo: true
pip: name={{ item }}
with_items: python_packages_to_install
Avec la liste des paquets:
-
include: python_basics.yaml
vars:
python_packages_to_install:
- virtualenv
- pss
- requests
- comment-builder
- boto
- ansible
- uwsgitop
- gitpull
- ipython
La tâche fonctionne correctement et installe les paquets:
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)
Le problème est que chaque ligne est exécutée à l'aide d'un consécutives, la commande SSH, plutôt que d'installer tous les paquets en un seul appel.
Est-il un moyen d'installer plusieurs paquets Python sur un Ansible pip
commande?
OriginalL'auteur Adam Matan | 2015-07-14
Vous devez vous connecter pour publier un commentaire.
Expansion sur Ben la réponse, vous pouvez également continuer à préserver la liste de paquets comme une yaml liste que vous l'avez, et de faire de la projection sur une seule valeur lorsque vous passer à la pip module de type:
pip: name="{{ python_packages_to_install | join(' ') }}"
Maintient votre playbook un peu plus facile à gérer...
msg: this module requires key=value arguments (['name=virtualenv', 'pss', 'requests', 'comment-builder', 'boto', 'ansible', 'uwsgitop', 'gitpull', 'ipython'])
. Quelque chose qui est probablement mal avec stringifying la liste.Une paire de guillemets est nécessaire - mise à jour de votre réponse.
Oh ouais - j'ai effectivement testé avec le multi dictionnaire de la syntaxe, mais écrasé vers le bas pour le raccourci de la syntaxe pour la réponse (qui n'a généralement pas besoin de le devis, sauf si il y a des espaces, selon Ansible version). Merci pour la correction. 😉
Mieux utiliser la syntaxe YAML, Ansible est la clé=valeur de la syntaxe est assez hacky et fragile.
ce que j'ai entendu (je suis sur le Ansible ingénierie de base de l'équipe 😉 )
OriginalL'auteur nitzmahone
Contrairement à Ansible
apt
module, lepip
module n'accepte pas une liste délimitée par des virgules de paquets. Au lieu de cela, vous pouvez fournir tous les noms de package comme un espace délimité par la chaîne, à l'aide de la==
syntaxe pour spécifier les versions:Si vous êtes comme moi, il peut vous frapper comme laid et pas pratique à gérer. Une alternative est d'utiliser le
requirements
option dans le module pip pour spécifier un fichier. Bien sûr, vous aurez besoin de créer les conditions du premier fichier, probablement à l'aide d'un modèle.OriginalL'auteur Ben Whaley