Як отримати декілька файлів з віддаленої машини на локальну з Ansible


17

Я хотів би скопіювати файли з віддаленого каталогу в локальний каталог за допомогою Ansible, але модуль завантаження дозволяє мені копіювати лише один файл. У мене є багато серверів, з яких мені потрібні файли (один і той же каталог кожного сервера), і я зараз не знаю, як це зробити за допомогою 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 - джерело localhost або делегат; У режимі потягу джерелом є віддалений хост у контексті.


1
Я виявив, що synchroniseмодуль є набагато надійнішим і масштабованим, ніж інші методи, якими можна виконувати копіювання файлів.
пташенята

3
Це, безумовно, кращий спосіб зробити це, ніж прийнята відповідь.
дитина від

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

З_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

добре, якщо ви використовуєте останню версію ансібіла, як-от 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. Перетягніть каталоги з вузла на 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 "

інвентар

[nodes]
server1
server2
server3
[profiling_server]
server1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.