2016-03-26 26 views
6

Tôi có một Playbook Ansible rất đơn giản, tất cả các phụ thuộc được cài đặt cho docker-compose và docker nhưng tôi gặp lỗi khi cài đặt docker-compose, đây là nhiệm vụ trên playbook của tôi để cài đặt docker-compose trong môi trường CentOS7.Lỗi khi cài đặt docker-compose sử dụng ansible-playbook

#ensure docker-compose and chmod +x /usr/local/bin/docker-compose 
    - name: Ensure docker-compose is installed and available 
    command: curl -L https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
    - name: Ensure permissions docker-compose 
    command: chmod +x /usr/local/bin/docker-compose 

Các lỗi sau xuất hiện:

TASK: [Ensure docker-compose is installed and available] ********************** 
failed: [nutrilife-aws] => {"changed": true, "cmd": ["curl", "-L", "https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname", "-s`-`uname", "-m`", ">", "/usr/local/bin/docker-compose"], "delta": "0:00:00.004592", "end": "2016-03-26 14:19:41.852780", "rc": 2, "start": "2016-03-26 14:19:41.848188", "warnings": ["Consider using get_url module rather than running curl"]} 
stderr: curl: option -s`-`uname: is unknown 
curl: try 'curl --help' or 'curl --manual' for more information 

FATAL: all hosts have already failed -- aborting 

PLAY RECAP ******************************************************************** 
      to retry, use: --limit @/home/mmaia/playbook.retry 

nutrilife-aws    : ok=4 changed=0 unreachable=0 failed=1 

Tôi loại mắc kẹt với lỗi đơn giản này cho một vài giờ. Tôi nhận lệnh từ trang docker chuẩn và được kiểm tra trực tiếp trong trình bao và nó hoạt động. Tôi cũng đã thử sử dụng dấu ngoặc kép để bọc xung quanh lệnh như lệnh: "curl ..." nhưng nó không thay đổi lỗi.

Trả lời

13

Như helloVpointed out bạn cần phải sử dụng các mô-đun shell nếu bạn muốn sử dụng những thứ như mở rộng vỏ hoặc các biến môi trường của shell.

Tuy nhiên, trong Ansible, bạn thường sử dụng các mô-đun cấp cao hơn và chỉ sử dụng các mô-đun shell hoặc command nếu bạn không thể làm những gì bạn cần với mô-đun khác. Cách tiếp cận này cho phép bạn kiểm soát tốt hơn việc thực hiện miễn phí, chẳng hạn như tính dễ sử dụng và khả năng hiển thị đầu ra tốt hơn.

Trong trường hợp của bạn, bạn có thể sử dụng get_url (Tôi tin rằng Ansible sẽ cảnh báo bạn nếu bạn cố gắng loại bỏ với curl mà bạn có thể làm tốt hơn với mô-đun này) để tìm mọi thứ từ internet.

Trong trường hợp của bạn nhiệm vụ của bạn có thể trông giống như thế này:

- name: Ensure docker-compose is installed and available 
    get_url: 
     url : https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-{{ ansible_system }}-{{ ansible_userspace_architecture }} 
     dest: /usr/local/bin/docker-compose 
     mode: 'u+x,g+x' 

Nhiệm vụ trên sử dụng các biến đặc biệt được trả về bởi gathering facts trên host mục tiêu do đó nhiệm vụ của bạn sẽ chạy tốt trên cả hệ thống Linux hoặc OS X (bạn cần hậu tố có điều kiện là .exe để liên kết Windows hoạt động và rõ ràng là một đường dẫn đích khác, v.v.).

Nó cũng sử dụng thông số mode từ mô-đun file để thêm quyền thực thi cho người dùng và nhóm để bạn có thể tránh tác vụ chmod của mình.

+0

Điều này giống như một gợi ý khôn ngoan, cũng sẽ thử nó vì nó có vẻ là một "thực hành tốt" tốt hơn. Cảm ơn bạn! –

+0

Câu trả lời của bạn đã giúp tôi rất nhiều. Tôi phải cài đặt 'linux-image-extra - $ (uname -r) 'như một gói trong danh sách yaml, nhưng tôi không thể. Goole giới thiệu cho tôi trang này và quan điểm của bạn về việc sử dụng 'sự kiện thu thập' đã giúp tôi. Bây giờ tôi có thể cài đặt thông qua 'linux-image-extra - {{ansible_kernel}} '. Cảm ơn –

+1

Tôi cũng đề xuất sử dụng 'checksum' khi tải xuống tệp qua internet! –

5

command không được xử lý thông qua trình bao. Sử dụng shell.

- name: Ensure docker-compose is installed and available 
    shell: curl -L https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
+0

Vâng, nó hoạt động và có, tôi là một tổng noob với ansible :). Cảm ơn nhiều. –