Pip Ansible:在一个会话上安装多个Python包

Pip Ansible:在一个会话上安装多个Python包,pip,ansible,ansible-playbook,Pip,Ansible,Ansible Playbook,我的一个剧本包含一个安装基本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_t

我的一个剧本包含一个安装基本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)
使用以下软件包列表:

---
  -
    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)
该任务正常工作并安装程序包:

---
  -
    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命令执行的,而不是在一个调用中安装所有包


有没有办法在Ansible
pip
命令上安装多个Python软件包?

与Ansible
apt
模块不同,它不接受以逗号分隔的软件包列表。相反,您可以使用
=
语法指定版本,以空格分隔的字符串形式提供所有包名:

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

如果你像我一样,你可能会觉得管理起来既丑陋又不切实际。另一种方法是使用pip模块中的
需求
选项来指定需求文件。当然,您需要首先创建需求文件,可能需要使用模板

扩展Ben的答案,您还可以继续将包列表保留为yaml列表,就像您拥有的一样,并在将其传递给pip模块时将其投影为单个值,如:

pip:name=“{{python_-packages_-to_-install | join('')}”


使您的剧本更易于维护…

我得到一个
消息:此模块需要key=value参数(['name=virtualenv',pss',requests',comment builder',boto',ansible',uwsgitop',gitpull',ipython')
。字符串化列表可能有问题。需要一对引号-更新您的答案。哦,是的-我实际上用多行字典语法测试了它,但将其压缩为答案的快捷语法(通常不需要引号,除非有空格,取决于Ansible版本)。谢谢你的修复@MattDavis最好使用YAML语法,Ansible的key=value语法非常粗糙和脆弱。@augurar所以我听说(我是Ansible核心工程团队的成员;)