Как скопировать файлы между двумя узлами, используя
Мне нужно скопировать машину формы A в машину B, тогда как моя управляющая машина, откуда я запускаю все мои задачи, - это машина C (локальная машина)
Я пробовал следующее:
Использовать команду scp в модуле оболочки недоступного
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp [email protected]:/path-of-file/file1 /home/user2/file1
Этот подход просто продолжается и продолжается никогда.
использовать модули для извлечения и копирования
hosts: machine1
user: user1
tasks:
- name: copy file from machine1 to local
fetch: src=/path-of-file/file1 dest=/path-of-file/file1
hosts: machine2
user: user2
tasks:
- name: copy file from local to machine2
copy: src=/path-of-file/file1 dest=/path-of-file/file1
Этот подход вызывает у меня ошибку:
error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'
Любые предложения будут полезны.
Ответы
Ответ 1
Для копирования удаленных файлов вы можете использовать модуль синхронизации с ключевым словом delegate_to: source-server
:
- hosts: serverB
tasks:
- name: Copy Remote-To-Remote (from serverA to serverB)
synchronize: src=/copy/from_serverA dest=/copy/to_serverB
delegate_to: serverA
Этот playbook может работать с вашей машиныC.
Ответ 2
Как уже указывал ant31, вы можете использовать модуль synchronize
. По умолчанию модуль передает файлы между машиной управления и текущим удаленным хостом (inventory_host
), однако это можно изменить с помощью задачи delegate_to
(важно отметить, что это параметр задачи, а не модуля).
Вы можете поставить задачу на ServerA
или ServerB
, но вы должны соответственно отрегулировать направление передачи (используя параметр mode
synchronize
).
Размещение задачи на ServerB
- hosts: ServerB
tasks:
- name: Transfer file from ServerA to ServerB
synchronize:
src: /path/on/server_a
dest: /path/on/server_b
delegate_to: ServerA
В этом случае используется mode: push
по умолчанию, поэтому файл передается из делегата (ServerA
) на текущий пульт (ServerB
).
Это может показаться странным, поскольку задача была поставлена на ServerB
(через hosts: ServerB
). Однако следует иметь в виду, что задача фактически выполняется на делегированном узле, который в этом случае равен ServerA
. Таким образом, нажатие (от ServerA
до ServerB
) действительно правильное направление. Также помните, что мы не можем просто отказаться от делегирования вообще, поскольку это означает, что передача происходит между управляющей машиной и ServerB
.
Размещение задачи на ServerA
- hosts: ServerA
tasks:
- name: Transfer file from ServerA to ServerB
synchronize:
src: /path/on/server_a
dest: /path/on/server_b
mode: pull
delegate_to: ServerB
Используется mode: pull
для инвертирования направления передачи. Опять же, имейте в виду, что задача фактически выполняется на ServerB
, поэтому выбор является правильным выбором.
Ответ 3
Я смог решить это, используя local_action для scp для файла из machineA в machineC, а затем скопировав файл в machineB.
Ответ 4
Это для меня похоже на ошибку. Я сообщил об этом здесь.
Ответ 5
Если вам нужно синхронизировать файлы между двумя удаленными узлами через ansible, вы можете использовать это:
- name: synchronize between nodes
environment:
RSYNC_PASSWORD: "{{ input_user_password_if_needed }}"
synchronize:
src: rsync://[email protected]_server:/module/
dest: /destination/directory/
// if needed
rsync_opts:
- "--include=what_needed"
- "--exclude=**/**"
mode: pull
delegate_to: "{{ inventory_hostname }}"
когда на remote_server
вам нужно запустить rsync с режимом демона. Простой пример:
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
port = port
[module]
path = /path/to/needed/directory/
uid = nobody
gid = nobody
read only = yes
list = yes
auth users = user
secrets file = /path/to/secret/file
Ответ 6
Простой способ использования модуля копирования для передачи файла с одного сервера на другой
Здесь есть playbook
---
- hosts: machine1 {from here file will be transferred to another remote machine}
tasks:
- name: transfer data from machine1 to machine2
copy:
src=/path/of/machine1
dest=/path/of/machine2
delegate_to: machine2 {file/data receiver machine}
Ответ 7
Если вы хотите использовать rsync и использовать пользовательский и пользовательский ssh-ключ, вам нужно написать этот ключ в опциях rsync.
---
- name: rsync
hosts: serverA,serverB,serverC,serverD,serverE,serverF
gather_facts: no
vars:
ansible_user: oracle
ansible_ssh_private_key_file: ./mykey
src_file: "/path/to/file.txt"
tasks:
- name: Copy Remote-To-Remote from serverA to server{B..F}
synchronize:
src: "{{ src_file }}"
dest: "{{ src_file }}"
rsync_opts:
- "-e ssh -i /remote/path/to/mykey"
delegate_to: serverA
Ответ 8
Вы также можете использовать deletgate
с scp
:
- name: Copy file to another server
become: true
shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
delegate_to: other.example.com
Из-за delegate
команда запускается на другом сервере, и она scp
файл самому себе.