Как получить несколько файлов с удаленного компьютера на локальный с помощью Ansible
Я хотел бы скопировать файлы из удаленного каталога в локальный каталог с помощью Ansible, но модуль fetch позволяет мне копировать только один файл. У меня есть много серверов, с которых мне нужны файлы (один каталог на каждом сервере), и я не знаю, как это сделать с Ansible.
Есть идеи?
10 ответов
Вам, вероятно, нужно будет зарегистрировать удаленный контент, а затем зациклить его, что-то вроде этого должно работать:
- 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/
с каталогом на вашем мастере
Вы должны использовать модуль синхронизации для этого. Это использует удивительную силу 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 удаленный хост в контексте является источником.
У меня недостаточно репутации, чтобы комментировать, иначе я бы добавил это.
Я использовал то, что написал Кестутис. я должен был сделать небольшую модификацию
- 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 был областью, которую я должен был изменить. иначе он не смог найти файлы.
Хорошо , если вы используете последнюю версию 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 }}"
Исправление примера выше
- 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 }}"
- 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
Я подготовил playbook, который поможет получить отчет о производительности nmon с сервера. Я использовал модуль fetch со ссылкой на вывод модуля оболочки и могу идеально загрузить данные nmon.
---
#NMON PERFORMANCE REPORT FETCH
- hosts: all
gather_facts: yes
become: yes
vars_prompt:
- name: "date_input"
prompt: "Enter date to fetch nmon report (YYMMDD) = "
private: no
tasks:
- pause:
prompt: "\n\n Enter date to fetch nmon report?\n\n--------------------------------------\n\n1. Fetch nmon:\n2. Exist from Playbook:\n\nPlease select Action: \n--------------------------------------\n"
register: menu
- set_fact:
option: "{{ menu.user_input }}"
- name: Find-out nmon report for given date {{ inventory_hostname }}
shell: |
ls -l /var/nmon/data/* | grep -i {{ date_input }} |awk '{print $NF}'
register: nmon_files_to_copy
when: option == "1"
- name: 'Fetch the NMON Report {{ date_input }} output from server {{ inventory_hostname }}'
fetch:
src: "{{ item }}"
dest: /tmp/
flat: yes
with_items: "{{ nmon_files_to_copy.stdout_lines }}"
when: option == "1"
вы можете сжать свою папку и получить ее.{{inventory_hostname}} подходящее имя файла для файла 'tgz' на вашем сервере ansible
- name: Compress folder
community.general.archive:
path: "/folder/dir"
dest: "/dst/{{inventory_hostname}}.tgz"
- name: Fetch the file from server
fetch:
src: "/dst/{{inventory_hostname}}.tgz"
dest: ./backup/
flat: yes
Я использую это: 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.
- Перетащите каталоги с узла на локальный хост
- 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
Попробуй это -
- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
register: files_to_copy
- fetch: src=/remote/{{ item }} dest=/local/ flat=yes
with_items: "{{ files_to_copy.stdout_lines }}"