Как получить несколько файлов с удаленного компьютера на локальный с Ansible


17

Я хотел бы скопировать файлы из удаленного каталога в локальный каталог с помощью Ansible, но модуль fetch позволяет мне копировать только один файл. У меня есть много серверов, с которых мне нужны файлы (один и тот же каталог на каждом сервере), и я не знаю, как это сделать с Ansible.

Есть идеи?

Ответы:


22

Вам, вероятно, понадобится зарегистрировать удаленный контент, а затем зациклить его, что-то вроде этого должно работать:

- 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 }}"

где /remoteдолжен быть изменен путь к каталогу на вашем удаленном сервере и /local/каталог на вашем мастере


1
Кстати, это происходит только на один уровень (не включая подкаталоги) и вообще игнорирует каталоги, поэтому, если вы этого не хотите, просто измените соответствующую команду оболочки.
Кястутис

Что произойдет, когда я буду работать на нескольких серверах? будет ли каждый регистрировать свои собственные результаты? и выбрать правильные?
Амир Мехлер

Любая подсказка, как это сделать с win_find? Я не могу понять, как получить дополнительный путь из списка файлов, который он возвращает
Питер Кан

27

Вы должны использовать модуль синхронизации для этого. Это использует удивительную силу rsync . Он будет копировать структуры файлов и каталогов любой глубины, пуленепробиваемый и высокоэффективный - копировать только те байты, которые были изменены:

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

Ключ является modeпараметром:

Укажите направление синхронизации. В режиме push источником является локальный хост или делегат; В режиме pull удаленный хост в контексте является источником.


1
Я обнаружил, что synchroniseмодуль гораздо надежнее и масштабируемее, чем другие методы, которые нужны для копирования файлов.
цыплята

3
Это, безусловно, лучший способ сделать это, чем принятый ответ.
childofsoong

5

У меня недостаточно репутации, чтобы комментировать, иначе я бы добавил это.

Я использовал то, что написал Кестутис. я должен был сделать небольшую модификацию

- 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 был областью, которую я должен был изменить. иначе не удалось найти файлы.


2

Исправление примера выше

- 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

хорошо, если вы используете последнюю версию ANSIBLE, такую ​​как 2.2.1.0, я думаю, что нам нужны кавычки для элемента

- 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

Я использую это: 1. Потяните каталоги с удаленного хоста на конкретные хосты

- 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. Перетащите каталоги с узла на локальный хост
- 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 "

инвентарь

[nodes]
server1
server2
server3
[profiling_server]
server1

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.