Ansible을 사용하여 원격 컴퓨터에서 로컬로 여러 파일을 가져 오는 방법


17

Ansible을 사용하여 원격 디렉토리에서 로컬 디렉토리로 파일을 복사하고 싶지만 가져 오기 모듈을 사용하면 하나의 파일 만 복사 할 수 있습니다. 파일이 필요한 많은 서버가 있으며 (각 서버마다 동일한 디렉토리) Ansible 로이 작업을 수행하는 방법을 찾지 못했습니다.

어떤 아이디어?

답변:


22

아마도 원격 컨텐츠를 등록하고 루프 오버하는 것보다는 다음과 같이 작동해야 할 것입니다.

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

/remote원격 서버의 디렉토리 경로 /local/와 마스터의 디렉토리로 변경 해야하는 위치


1
그건 그렇고, 이것은 한 수준 깊이 (하위 디렉토리 제외)로 이동하고 일반적으로 디렉토리를 무시하므로 원하는 것이 아닌 경우 쉘 명령을 적절하게 변경하십시오.
Kęstutis

여러 서버에서 실행하면 어떻게됩니까? 각각 자신이 찾은 결과를 등록합니까? 올바른 것을 가져와?
Amir Mehler

win_find로 이것을 수행하는 방법에 대한 단서가 있습니까? 파일 목록에서 추가 경로를
Peter Kahn

27

이렇게하려면 동기화 모듈 을 사용해야합니다 . 이것은 rsync 의 놀라운 힘을 사용합니다 . 깊이와 깊이에 상관없이 파일 및 디렉토리 구조를 복사하며, 방탄 및 매우 효율적입니다. 변경된 실제 바이트 만 복사합니다.

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

열쇠는 mode매개 변수입니다.

동기화 방향을 지정하십시오. 푸시 모드에서는 localhost 또는 delegate가 소스입니다. 풀 모드에서 컨텍스트의 원격 호스트가 소스입니다.


1
내가 발견 한 synchronise모듈이 훨씬 더 안정적이고 확장 가능한 ansible 파일을 복사하는 다른 방법보다 할 수 있습니다.
병아리

3
이것은 허용 된 답변보다 확실히하는 더 좋은 방법입니다.
childofsoong

5

나는 그렇지 않으면 그것을 추가 할 의견이 충분하지 않습니다.

나는 Kęstutis가 게시 한 것을 사용했습니다. 나는 약간의 수정을해야했다

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

with_items는 내가 바꿔야 할 영역이었습니다. 그렇지 않으면 파일을 찾을 수 없습니다.


2

위의 예제 수정

- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: files_to_copy
    - fetch: src={{ item.path }} dest=/tmp
      with_items: "{{ files_to_copy.files }}"

1

글쎄, 2.2.1.0과 같은 최신 버전을 사용하고 있다면 항목에 따옴표가 필요하다고 생각합니다.

- name: use find to get the files list which you want to copy/fetch
  find: 
    paths: /etc/
    patterns: ".*passwd$"
    use_regex: True   
  register: file_2_fetch

- name: use fetch to get the files
  fetch:
    src: "{{ item.path }}"
    dest: /tmp/
    flat: yes
  with_items: "{{ file_2_fetch.files }}"

0
- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: file_to_copy
    - fetch: src={{ item }} dest=/tmp
      with_items: files_to_copy.stdout_lines

이것은 전혀 작동하지 않습니다. 이것이 시도 되었습니까?
바질 A

0

나는 이것을 사용합니다 : 1. 원격 호스트에서 특정 호스트로 디렉토리를 가져옵니다

- name: Gather hosts stats from other hosts
  shell: " scp -r {{results_root_dir_src}} root@{{groups['profiling_server'][0]}}:{{results_root_dir_dest}}/abc/"
  when: "'profiling_server' not in group_names"
#It will not run on the node where the directories need to be copied.
  1. 노드에서 로컬 호스트로 디렉토리 가져 오기
- name: Gather from host to local
  delegate_to: 127.0.0.1
  run_once: true
  become: false
  shell: "scp -r root@{{groups['profiling_server'][0]}}:{{results_root_dir}} ./results_local_location "

목록

[nodes]
server1
server2
server3
[profiling_server]
server1

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