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

时间:2015-07-14 01:23:25

标签: 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_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包?

2 个答案:

答案 0 :(得分:10)

扩展Ben的答案,您还可以继续将包列表保存为yaml列表,并将其投影到单个值,将其传递给pip模块,如:

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

让你的剧本更易于维护......

答案 1 :(得分:3)

与Ansible apt模块不同,the pip module不接受以逗号分隔的包列表。相反,您可以使用==语法指定版本来提供所有包名称作为空格分隔的字符串:

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

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

相关问题