Cách tìm nạp nhiều tệp từ máy từ xa đến cục bộ bằng Ansible


17

Tôi muốn sao chép các tệp từ thư mục từ xa sang thư mục cục bộ với Ansible nhưng mô-đun tìm nạp cho phép tôi chỉ sao chép một tệp. Tôi có nhiều máy chủ mà tôi cần các tệp (cùng một thư mục cho mỗi máy chủ) và bây giờ tôi không biết làm thế nào với Ansible.

Có ý kiến ​​gì không?

Câu trả lời:


22

Bạn có thể sẽ cần phải đăng ký nội dung từ xa và hơn là lặp lại nội dung đó, một cái gì đó như thế này sẽ hoạt động:

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

nơi /remotenên được thay đổi với đường dẫn thư mục trên máy chủ từ xa của bạn và /local/với thư mục trên máy chủ của bạn


1
Nhân tiện, điều này chỉ đi sâu một cấp (bỏ các thư mục con) và bỏ qua các thư mục nói chung vì vậy nếu đó không phải là thứ bạn mong muốn, chỉ cần thay đổi lệnh shell theo cách khác.
Kęstutis

Điều gì sẽ xảy ra khi tôi chạy trên một loạt các máy chủ? mỗi người sẽ đăng ký những phát hiện của riêng mình? và lấy đúng cái nào?
Amir Mehler

Có manh mối nào để làm điều này với win_find không? Tôi không thể tìm ra cách thêm đường dẫn từ danh sách tệp mà nó trả về
Peter Kahn

27

Bạn nên sử dụng mô-đun đồng bộ hóa để làm điều này. Điều này sử dụng sức mạnh tuyệt vời của rsync . Nó sẽ sao chép cấu trúc tệp và thư mục ở bất kỳ độ sâu nào, có khả năng chống đạn và hiệu quả cao - chỉ sao chép các byte thực tế đã thay đổi:

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

Chìa khóa là modetham số:

Chỉ định hướng đồng bộ hóa. Trong chế độ đẩy, localhost hoặc đại biểu là nguồn; Trong chế độ kéo, máy chủ từ xa trong ngữ cảnh là nguồn.


1
Tôi đã tìm thấy synchronisemô-đun đáng tin cậy và có thể mở rộng hơn nhiều so với các phương pháp khác mà ansible phải sao chép các tập tin.
gà con

3
Đây chắc chắn là một cách tốt hơn để làm điều đó hơn câu trả lời được chấp nhận.
childofsoong

5

Tôi không có đủ đại diện để bình luận nếu không tôi sẽ thêm nó.

Tôi đã sử dụng những gì Kęstutis đăng. tôi đã phải sửa đổi một chút

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

With_items là khu vực tôi phải thay đổi. nó không thể xác định vị trí các tập tin khác.


2

Sửa ví dụ trên

- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: files_to_copy
    - fetch: src={{ item.path }} dest=/tmp
      with_items: "{{ files_to_copy.files }}"

1

tốt, nếu bạn đang sử dụng phiên bản ansible mới nhất, như 2.2.1.0, tôi nghĩ rằng chúng ta cần báo giá cho mục này

- name: use find to get the files list which you want to copy/fetch
  find: 
    paths: /etc/
    patterns: ".*passwd$"
    use_regex: True   
  register: file_2_fetch

- name: use fetch to get the files
  fetch:
    src: "{{ item.path }}"
    dest: /tmp/
    flat: yes
  with_items: "{{ file_2_fetch.files }}"

0
- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: file_to_copy
    - fetch: src={{ item }} dest=/tmp
      with_items: files_to_copy.stdout_lines

Điều này hoàn toàn không hoạt động. Điều này đã được thử chưa?
Basil A

0

Tôi sử dụng điều này: 1. Kéo thư mục từ máy chủ từ xa đến máy chủ cụ thể

- name: Gather hosts stats from other hosts
  shell: " scp -r {{results_root_dir_src}} root@{{groups['profiling_server'][0]}}:{{results_root_dir_dest}}/abc/"
  when: "'profiling_server' not in group_names"
#It will not run on the node where the directories need to be copied.
  1. Kéo thư mục từ nút đến localhost
- name: Gather from host to local
  delegate_to: 127.0.0.1
  run_once: true
  become: false
  shell: "scp -r root@{{groups['profiling_server'][0]}}:{{results_root_dir}} ./results_local_location "

hàng tồn kho

[nodes]
server1
server2
server3
[profiling_server]
server1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.