2015-10-01 31 views
16

Những gì tôi đang cố gắng thực hiện là chạy các lệnh bên trong một vùng chứa Docker đã được tạo trên một vùng biển kỹ thuật số Ubuntu/Docker Droplet sử dụng Ansible.Chạy lệnh bên trong của vùng chứa Docker Sử dụng Ansible

Dường như không tìm thấy bất cứ điều gì về điều này, hoặc tôi đang thiếu thứ gì đó. Đây là nhiệm vụ Ansible của tôi trong cuốn sách chơi của tôi. Tôi rất mới với Ansible nên mọi lời khuyên hay sự khôn ngoan sẽ được đánh giá cao.

- name: Test Deploy 
    hosts: [my-cluster-of-servers] 

tasks: 
    - name: Go Into Docker Container And Run Multiple Commands 
    docker: 
     name: [container-name] 
     image: [image-ive-created-container-with-on-server] 
     state: present 
     command: docker exec -it [container-name] bash 
+2

tiếc là câu trả lời bạn đã chấp nhận không hiển thị cách thực thi tập lệnh thông qua Ansible, thay vào đó nó hiển thị cách thực thi từ máy chủ lưu trữ docker. Nếu bạn có nó để làm việc thông qua Ansible bạn có thể xin vui lòng gửi giải pháp của bạn – schmidlop

Trả lời

10

Bạn sẽ có thể thực hiện một kịch bản (với chuỗi lại lệnh trong nó) với docker exec:

docker exec container-name bash -l -c /path/to/script > /path/to/log 

(Xem thêm "Why do I have to use bash -l -c inside my container?")

  • /path/to/script nên có thể truy cập bằng quy trình Ansible của bạn.
  • /path/to/log là đường dẫn bên trong vùng chứa, có thể được chia sẻ trong một ổ đĩa.
+0

Điều đó làm việc! Cảm ơn rất nhiều @VonC –

+0

Bạn có thể làm rõ ý nghĩa của "nên được truy cập bởi quá trình Ansible của bạn."? Điều đó có nghĩa là kịch bản nên được trên máy điều khiển ansible? Máy chủ docker? hoặc bên trong container? – schmidlop

+1

@schmidlop Ý tôi là: có một thùng chứa đang chạy. Bên trong thùng chứa đó, có '/ path/to/script' không thực thi đúng cách.Một cách để thử lại kịch bản đó là thực hiện nó (từ lệnh 'docker exec' chạy từ máy chủ Linux) và ghi lại kết quả của nó trên máy chủ trong'/path/to/log' – VonC

2

Bạn có thể chạy các lệnh bên trong container Docker sử dụng command module Ví dụ đoạn mã này sẽ thực hiện echo "Hello1"echo "Hello2" trong my_container:

tasks: 
     - name: Execute commands in docker container 
      command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"' 
+0

Điều này hoạt động nếu vùng chứa docker nằm trên cùng một máy mà tập lệnh ansible đang chạy. Điều gì sẽ xảy ra nếu thùng chứa docker đang chạy trên một máy khác? – Bernie

+0

Tôi không tin đó là sự thật, @Bernie. Sự hiểu biết của tôi là local_action thực hiện như bạn mô tả, nhưng mô-đun lệnh luôn chạy trên máy chủ từ xa, trừ khi tham số delegate_to được cung cấp. –

+0

Tôi đã phải sử dụng 'docker exec -i ' để tránh lỗi này 'thiết bị đầu vào không phải là TTY' – vikas027

1

Cập nhật: có một cách để làm điều này mà không cần dùng của tôi , hãy xem câu trả lời khác của tôi

Tôi đã viết một mô-đun đơn giản để chạy exec trên máy chủ Docker từ xa. Tôi đã submitted it to the ansible project, nhưng bạn có thể dễ dàng thêm nó vào các dự án của riêng bạn nếu bạn cần. Module này chỉ dài 23 dòng, mang nó từ yêu cầu kéo của tôi và thêm nó vào thư mục ./library của bạn, và sau đó bạn có thể thêm một nhiệm vụ trong playbook của bạn như vậy:

- name: Run docker exec command 
    docker_exec: 
     command: <some command> 
     docker_host: <docker host> 
     name: <container name> 
    register: exec_output 

    - name: Show exec output 
    debug: msg="{{ exec_output.result }}" 
+0

PR không được hợp nhất và tác giả đóng nó với ghi chú "Tôi thừa nhận bây giờ, không có điểm nào cho mô-đun của tôi." –

12

Sau khi thảo luận với một số rất hữu ích nhà phát triển trên ansible github project, một cách tốt hơn để làm điều này là như vậy:

- name: add container to inventory 
    add_host: 
    name: [container-name] 
    ansible_connection: docker 
    changed_when: false 

- name: run command in container 
    delegate_to: [container-name] 
    raw: bash 

Nếu bạn đã cài đặt python trong hình ảnh của bạn, bạn có thể sử dụng các mô-đun lệnh hoặc bất kỳ thành phần khác thay vì thô.

Nếu bạn muốn làm điều này trên một máy chủ từ xa Docker, thêm:

ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]" 

vào khối add_host.

Xem Ansible documentation để biết ví dụ hoàn chỉnh hơn.

+0

Thú vị và chính xác hơn câu trả lời của tôi. +1 – VonC

+0

Cảm ơn bạn đã trợ giúp. Như thường lệ, khởi động lại từ các vấn đề được giải quyết. – techraf

+1

Điều này yêu cầu quyền truy cập API Docker vào máy chủ bằng Công cụ Docker (nếu không phải là máy chủ cục bộ) - nếu quy tắc tường lửa chặn điều này, bạn có thể cần sử dụng phương pháp 'docker exec ... bash -c ...'. Tôi không thấy làm thế nào bạn có thể sử dụng delegate_to cho máy chủ từ xa, vì nó đã được sử dụng cho kết nối docker vào container. – RichVel

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