ansible을 사용하여 두 노드간에 파일을 복사하는 방법


97

모든 ansible 작업을 실행하는 내 제어 시스템은 시스템 C (로컬 시스템) 인 반면 파일 형식 시스템 A를 시스템 B에 복사해야합니다.

나는 다음을 시도했다 :

ansible의 쉘 모듈에서 scp 명령 사용

hosts: machine2
user: user2
tasks:
  - name: Copy file from machine1 to machine2 
    shell: scp user1@machine1:/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. 이것은 제어 기계가 멀리 떨어져있을 때 네트워크 액세스를 저장하는 편리한 기능입니다. 당 이제 해결하실 수 2.Should github.com/ansible/ansible/pull/16756 2016년 9월 23일에 (STABLE) : jctanner이 ansible에 0d94d39 커밋 합병
AnneTheAgile

답변:


101

원격에서 원격으로 파일을 복사하려면 ' '키워드로 동기화 모듈을 사용할 수 있습니다 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

이 플레이 북은 컴퓨터에서 실행할 수 있습니다.


좋은 대답! 불행히도 다중 VM이있는 Vagrant 환경에서 작동하지 않았습니다. Vagrant는 거기서 특별한 일을하는 것 같습니다.
therealmarv

rsync를 사용합니다. VM에 설치되어 있습니까?
ant31

1
Vagrant 1.7.x부터는 컴퓨터에 따라 다른 개인 키를 사용합니다. github.com/mitchellh/vagrant/issues/4967 문제를 참조하십시오. Vagrantfile에 다음 줄을 삽입 config.ssh.insert_key = false하여 Vagrant가 모든 시스템에 액세스하기 위해 ONE insecure_key를 사용하도록합니다. 하지만 이제는 오류 메시지도받지 않습니다 (영원히 기다립니다). 또한 버그 github.com/ansible/ansible/issues/7250 은 원격에서 원격으로 복사 할 수 없다고 말합니다.
therealmarv

9
이것은 실제로 serverB에서 serverA로 파일을 복사합니다. serverA에서 serverB로 복사하려면 mode=push(또는 delegate_to: serverB둘다는 아님)를 사용하십시오.
Marius Gedminas

2
@MariusGedminas 당신이 정확하고 mode=push사용해야하지만이 상황 에서는 소스와 대상을 delegate_to: serverB만들기 때문에 사용할 수 없습니다 serverB.
Strahinja Kustudic

95

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되므로 당기는 것이 올바른 선택입니다.


8
이것은 Ansible 문서의 일부가되어야하는 좋은 대답 입니다. 거기에있는 어떤 예도 이것을 그렇게 분명하게 설명하지 않습니다. 감사!
ssc

2
나는 이것을 여러 가지 방법으로 시도했지만 Warning: Identity file /Users/myuser/.ssh/id_servers not accessible.
orotemo

@orotemo : 추가 정보가 없으면 추측 만 할 수 있지만 SSH 설정에 문제가있는 것 같습니다. 오류 메시지에 제공된 ID 파일을 사용하도록 SSH 또는 Ansible을 구성했는지, 해당 파일이 존재하고 올바른 권한이 있는지 확인하십시오.
플로리안 브루 커

2
@WilliamTurrell 전송 방향을 더 자세히 설명하기 위해 답변을 업데이트했습니다. 모듈은 실제로 약간 혼란 스럽습니다.
Florian Brucker 2016 년

1
감사. @orotemo의 문제가있는 다른 사람의 경우 가능한 해결책은 서버 A와 B 사이에 공개 키 액세스 권한이 없거나 한 방향으로 만 작동하도록 설정 한 것입니다. 잘못된 방향입니다. 서버 A의 .ssh 디렉토리에 키 쌍이없는 경우 ansible은 로컬 머신의 홈 디렉토리를 사용하려고 시도합니다 (예 : Mac의 경우 존재하지 않으며 다른 계정 이름을 가질 수 있음).
윌리엄 터렐

3

ansible을 통해 두 원격 노드간에 파일을 동기화해야하는 경우 다음을 사용할 수 있습니다.

- name: synchronize between nodes
  environment:
    RSYNC_PASSWORD: "{{ input_user_password_if_needed }}"
  synchronize:
    src: rsync://user@remote_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

2

local_action을 사용하여 machineA에서 machineC로 파일로 이동 한 다음 파일을 machineB로 복사하여이 문제를 해결할 수있었습니다.


1

복사 모듈을 사용하여 한 서버에서 다른 서버로 파일을 전송하는 간단한 방법

플레이 북입니다

---
- 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}

이것은 오늘 세션 중에 떠 올랐지 만 우리 중 누구도 ansible 2.6.4를 사용하여 이것을 복제 할 수 없습니다. 먼저 machine1에 파일을 생성하고 나중에 디렉터리를 나열하여이 작업을 플레이 북에 넣는 것이 "Ansible Controller에서 '/ tmp / source-49731914'를 찾거나 액세스 할 수 없습니다."와 함께 실패했습니다. 호스트 머신에 빈 파일을 생성하면 문제가 해결되었지만 호스트> machine2를 복사했습니다. 일부 버전에서 버그가있는 동작이 있었습니까?
Stephan B

0

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

0

다음 deletgate과 함께 사용할 수도 있습니다 scp.

- name: Copy file to another server
  become: true
  shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
  delegate_to: other.example.com

delegate이 명령은 다른 서버에서 실행 되기 때문에 scp파일 자체가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.