Подтвердить что ты не робот

Как скопировать файлы между двумя узлами, используя

Мне нужно скопировать машину формы 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>'

Любые предложения будут полезны.

4b9b3361

Ответ 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.

Ответ 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 файл самому себе.