2014-08-29 15 views
16

Trong playbook của tôi, tôi cóAnsible thực hành tốt nhất để sao chép thư mục

- name: Grab h5bp/server-configs-nginx 
    git: repo=https://github.com/h5bp/server-configs-nginx.git 
     dest=/tmp/server-configs-nginx 
     version="3db5d61f81d7229d12b89e0355629249a49ee4ac" 
     force=yes 

- name: Copy over h5bp configuration 
    command: cp -r /tmp/server-configs-nginx/{{ item }} /etc/nginx/{{ item }} 
    with_items: 
    - "mime.types" 
    - "h5bp/" 

nào làm tăng cảnh báo trong ansible-lint:

[ANSIBLE0006] cp used in place of copy module 
/Users/austinpray/Dropbox/DEV/opensauce/bedrock-ansible/roles/nginx/tasks/main.yml:0 
Task/Handler: Copy over h5bp configuration 

Vì vậy, điều này đặt ra câu hỏi: có cách nào tốt hơn để làm điều này với mô-đun ansible chứ không phải là một lệnh?

Trả lời

6

Hiện tại, command là lựa chọn tốt nhất của bạn. Không có tùy chọn từ xa đến từ xa. Dưới đây là một chủ đề về nó: How to move/rename a file using an Ansible task on a remote system

Bạn có một vài lựa chọn khác:

  • bạn có thể sử dụng các mô-đun file để tạo ra một liên kết tượng trưng (bằng cách thiết lập src, path, và state=link
  • bạn có thể kiểm tra. trên repo trên máy chủ Ansible và sau đó sử dụng copy.Đây là một mô hình phổ biến hơn cho việc triển khai mã.
  • bạn có thể tiếp tục sử dụng command nhưng gói nó với một điều kiện là stat t chỉ ghi đè lên một lần. Điều này đặc biệt hữu ích nếu bạn sử dụng notify để khởi động lại nginx.

Cuối cùng, có vẻ như bạn có thể đang thực hiện "triển khai bằng git". Đó không phải lúc nào cũng là lựa chọn tốt nhất, đặc biệt là nếu bạn không "sở hữu" đó repo. Nhưng nó có thể tốt - chỉ một chút mùi mã.

+0

"Cuối cùng, có vẻ như bạn có thể đang thực hiện 'triển khai bằng git'." Đây là ngữ cảnh. Đây chỉ là một phần nhỏ trong việc thiết lập máy chủ. Về cơ bản tôi chỉ lấy một số cấu hình máy chủ hữu ích từ một repo từ xa được duy trì bởi cộng đồng. https://github.com/roots/bedrock-ansible/issues/31 –

+0

kết thúc lên chỉ cần bỏ rơi ansible-lint haha ​​ –

14

Bạn có thể sử dụng synchronize module với mode='pull'

- name: Copy over h5bp configuration 
synchronize: mode=pull src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} 
with_items: 
    - "mime.types" 
    - "h5bp/" 

Note: Để sao chép từ xa-to-xa, sử dụng lệnh tương tự và thêm delegate_to (như nguồn từ xa) và hiện tại inventory_host (như dest từ xa)

+0

Trong ansible 2.2, sử dụng mô-đun đồng bộ hóa như mô tả trong câu trả lời này hoặc sử dụng mô-đun lệnh với 'cp' như được mô tả trong câu hỏi là cách duy nhất để sao chép các thư mục từ xa đến xa. –

+1

Điều này nghe có vẻ đầy hứa hẹn nhưng tôi không thể hiểu được "ghi chú" của bạn. Bạn có thể đăng một ví dụ đầy đủ để thực hiện các bản sao tệp từ xa sâu đến xa không? Tôi đang cố gắng sao chép thư mục web-root từ một chia sẻ NFS vào đĩa cục bộ của mỗi máy chủ web trong một nhóm. Nói từ/nfs/www đến/var/www. – Idris

5

Một cách khác là để nén thư mục của bạn trước và sử dụng các mô-đun unarchive ansible:

- name: copy your folder using a work around 
    unarchive: src=your.zip dest=/destinationfolder 
    become: yes 

Thao tác này sẽ giải nén thư mục của bạn trên đích để bạn có một thư mục sao chép ;-) nhưng đừng quên để giải nén gói trên máy mục tiêu của bạn.

RHEL:

yum install -y unzip


Debian:

apt cài đặt giải nén

6

Ansible 2.0 mang lại các tham số remote_src đến copy mô-đun: http://docs.ansible.com/ansible/copy_module.html

Bây giờ bạn chỉ cần làm một cái gì đó như:

- name: Copy over h5bp configuration 
    copy: src=/tmp/server-configs-nginx/{{ item }} dest=/etc/nginx/{{ item }} remote_src=yes 
    with_items: 
    - "mime.types" 
    - "h5bp" 
+1

Sao chép từ xa (mô-đun sao chép với tham số remote_src được đặt thành 'true') không hỗ trợ bản sao đệ quy của thư mục và câu hỏi là về sao chép thư mục, vì vậy câu trả lời này vô ích –

+0

@AlanEvangelista hmm bạn nói đúng, bah mà hút. Tôi nghĩ câu trả lời vẫn hữu ích mặc dù vẫn có thể liệt kê tất cả các tệp. – PriceChild

0

Bạn có thể sử dụng with_fileglob: http://docs.ansible.com/ansible/playbooks_loops.html#id4

# copy each file over that matches the given pattern 
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 
    with_fileglob: 
    - /playbooks/files/fooapp/* 
+1

with_fileglob chỉ tìm kiếm tệp cục bộ, câu hỏi là về sao chép tệp từ xa sang điều khiển từ xa, vì vậy câu trả lời này vô ích –

+2

Câu trả lời này thực sự không chính xác cho ngữ cảnh này. Nhưng đối với tôi, đây chính xác là những gì tôi cần. Cảm ơn vì đăng :)! – onnimonni

+0

Mmmh, tệpglob không đệ quy. – musicformellons

0
  • bản sao: src = {{item}} dest =/etc/fooapp/directory_mode = yes

trường directory_mode của người dùng.

+1

vui lòng cung cấp thêm giải thích –

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