Как я могу указать удаленный сервер назначения при использовании модуля копирования в ansible

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