2015-07-14 13 views
7

Một trong playbooks của tôi có một nhiệm vụ đó cài đặt gói Python cơ bản:Ansible: cài đặt nhiều gói Python trên một phiên duy nhất

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

Với danh sách sau đây của gói:

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

Các công trình công việc một cách chính xác và cài đặt các gói:

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) 

Vấn đề là mỗi dòng được thực hiện sử dụng lệnh SSH liên tiếp, thay vì cài đặt tất cả các gói trong một cuộc gọi.

Có cách nào để cài đặt nhiều gói Python trên lệnh Ansible pip không?

Trả lời

8

Mở rộng về câu trả lời của Ben, bạn cũng có thể tiếp tục giữ danh sách gói như một danh sách yaml như bạn có nó, và làm như chiếu đến một giá trị duy nhất khi bạn vượt qua nó để các module pip như:

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

Giữ playbook của bạn một chút dễ bảo trì hơn ...

+0

tôi nhận được một 'msg: module này đòi hỏi key = đối số giá trị ([ 'name = virtualenv', 'PSS', 'yêu cầu', 'bình luận-builder ',' boto ',' ansible ',' uwsgitop ',' gitpull ',' ipython ']) '. Một cái gì đó có lẽ là sai với việc xâu chuỗi danh sách. –

+0

Một cặp dấu ngoặc kép là cần thiết - cập nhật câu trả lời của bạn. –

+1

Oh yeah- Tôi thực sự thử nghiệm nó với cú pháp từ điển nhiều dòng, nhưng đè nó xuống cú pháp phím tắt cho câu trả lời (thường không cần dấu ngoặc kép trừ khi có dấu cách, tùy thuộc vào phiên bản Ansible). Cảm ơn bạn đã sửa chữa. ;) – nitzmahone

3

Không giống như mô-đun Ansible apt, the pip module không chấp nhận danh sách các gói được phân cách bằng dấu phẩy. Thay vào đó, bạn có thể cung cấp tất cả các tên gói như là một chuỗi không gian giới hạn, bằng cách sử dụng cú pháp == để xác định phiên bản:

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

Nếu bạn đang như tôi nó có thể tấn công bạn như xấu xí và không thực tế để quản lý. Cách khác là sử dụng tùy chọn requirements trong mô-đun pip để chỉ định tệp yêu cầu. Tất nhiên bạn sẽ cần tạo tệp yêu cầu đầu tiên, có thể sử dụng mẫu.

Các vấn đề liên quan