#ansible #devops
#ansible #devops
Вопрос:
Копирование файла на второй сервер
Вот задача, которую я хочу выполнить, чтобы скопировать файл дампа с prod-сервера на тестовый сервер.
Как я могу явно указать, что такое пункт назначения? Или каков правильный подход.
Я уже создал каталог назначения на тестовом сервере (/home/{{sys_user}}/prod_db_copy/).
Вот задача, которую я попробовал:
- name: "Copy dump file to test server"
when: inventory_hostname in groups['prod']
copy:
src: "/home/{{ sys_user }}/db_copy/{{ db_name }}.dump.gz"
dest: "{{ inventory_hostname=='test' }} /home/{{sys_user}}/prod_db_copy/"
remote_src: yes
Ответ №1:
copy
Модуль копирует файлы с контроллера ansible на удаленную машину или файлы на удаленной машине, но то, что вы пытаетесь сделать, это копирование файлов между двумя удаленными машинами, поэтому copy
не будет выполнять эту работу. Вам нужно использовать synchronize
модуль delegate_to
с.
В зависимости от вашей сети и пользователей на компьютерах, вам может потребоваться добавить некоторые опции или добавить ssh-ключи к некоторым серверам, но в целом это может выглядеть так:
- hosts: prod
tasks:
- name: Transfer file from prod machines to backup-server
synchronize:
src: "/home/{{ sys_user }}/db_copy/{{ db_name }}.dump.gz"
dest: "/home/{{sys_user}}/prod_db_copy/"
mode: pull
delegate_to: backup-server
При этом используется pull
режим. Вы push
также можете использовать, но тогда вам нужно запустить задачу на backup-server
и делегировать ее prod
машине.
Комментарии:
1. Это не очень практично. 1) Это приведет к перезаписи одних и тех же файлов с разных хостов. 2) rsync должен быть установлен как на хостах, так и на сервере резервного копирования. 3) резервный сервер должен иметь возможность подключаться к хостам по ssh без пароля.
2. № 1 легко разрешим, добавив исходное имя хоста и временную метку к имени файла. № 2 не такая уж большая проблема, поскольку
rsync
он должен быть доступен и может быть легко установлен, если его нет. № 3 должен быть достижим с помощью ssh-ключей, и у вас всегда будет такая проблема, если вы хотите скопировать что-то между хостами напрямую. В противном случае вам нужно сначала загрузить его на контроллер, а затем загрузить на другой компьютер.