2015-07-14 2 views
7

Один из моих playbooks содержит задачу, которая устанавливает основные пакеты Python:анзибль: установить несколько пакетов Python на одной сессии

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

Со следующим списком пакетов:

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

Задача работ правильно и устанавливает пакеты:

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) 

Проблема в том, что каждая строка выполнена используя последовательную команду SSH, вместо того, чтобы устанавливать все пакеты за один вызов.

Есть ли способ установить несколько пакетов Python в команде Ansible pip?

ответ

8

Развивая ответ Бен, вы можете продолжать сохранять список пакетов в виде списка YAML, как у вас есть, и сделать проекцию на одно значение, когда вы передаете его к модулю пипа как:

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

держит ваш сборник пьес немного больше ... ремонтопригодны

+0

Я получаю 'Сообщ: этот модуль требует ключ = значение аргумента ([«имя = virtualenv»,«PSS»,«запросы»,«комментировать-строитель ',' boto ',' ansible ',' uwsgitop ',' gitpull ',' ipython ']). Возможно, что-то не так с строкой списка. –

+0

Необходима пара котировок - обновление вашего ответа. –

+1

О да, я на самом деле протестировал его с синтаксисом многострочного словаря, но сжал его до синтаксиса ярлыка для ответа (которому обычно не нужны кавычки, если только в нем нет пробелов, в зависимости от версии Ansible). Спасибо за исправление. ;) – nitzmahone

3

В отличие от модуля Ansible apt, the pip module не принимает список упаковок с разделителями-запятыми. Вместо этого, вы можете предоставить все имена пакетов в качестве пространства разделителей строки, используя синтаксис == для указания версии:

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

Если вы похожи на меня это может ударить вас, как некрасиво и непрактично управлять. Альтернативой является использование опции requirements в модуле pip для указания файла требований. Конечно, сначала вам нужно создать файл требований, возможно, используя шаблон.