Ansible로 여러 파일 복사


104

작업에서 Ansible을 통해 하나 이상의 파일을 원격 노드에 복사하려면 어떻게해야합니까?

파일을 정의하기 위해 내 작업에서 복사 모듈 줄을 복제하려고 시도했지만 첫 번째 파일 만 복사합니다.

답변:


131

이를 위해 with_fileglob루프를 사용할 수 있습니다 .

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_fileglob:
    - /playbooks/files/fooapp/*

3
이 접근 방식은 원격 시스템으로 복사하기 위해 동일한 루트에 모든 파일을 가지고 있다면 여러 디렉토리에 파일을 두는 것은 어떨까요? 예를 들어, 3 개의 다른 디렉토리에서 3 개의 파일을 복사하고 싶습니다
Mark

이봐, 나는 내 모든 파일을 이동하려고하는데이 /roles/db/files방법으로 작동시킬 수 없습니다. 내가 해봤 with_fileglob: - /roles/db/file/* 지만 경로를 미세하지 않습니다
배트맨

이 방법의 가장 큰 단점은 디렉토리 구조를 평평하게 만든다는 것입니다.
Quintin Par

115
- name: Your copy task
  copy: src={{ item.src }} dest={{ item.dest }}
  with_items:
    - { src: 'containerizers', dest: '/etc/mesos/containerizers' }
    - { src: 'another_file', dest: '/etc/somewhere' }
    - { src: 'dynamic', dest: '{{ var_path }}' }
  # more files here

이 솔루션을 dest변수로 설정 하는 것이 가능 합니까? { src: 'containerizers', dest: {{ containerizers }} }.
Gesias

2
@Gesias, 네. 사실, 양측이 될 수있는 변수 :{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
ntwrkguru

16

이 목적으로 with_together를 사용할 수 있습니다.

- name: Copy multiple files to multiple directories
  copy: src={{ item.0 }} dest={{ item.1 }}
  with_together:
    - [ 'file1', 'file2', 'file3' ]
    - [ '/dir1/', '/dir2/', '/dir3/' ]

작동하지만 의미 상으로는 깨끗하지 않습니다. 더 깨끗한 옵션이 있습니다.
plesiv

11

둘 이상의 위치가 필요한 경우 둘 이상의 작업이 필요합니다. 하나의 복사 작업은 한 위치 (여러 파일 포함)에서 노드의 다른 위치로만 복사 할 수 있습니다.

- copy: src=/file1 dest=/destination/file1
- copy: src=/file2 dest=/destination/file2

# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/destination/
  with_fileglob:
    - /files/*

-name : copy file1 copy : src = / file1 dest = / destination / file1-name : copy file2 copy : src = / file2 dest = / destination / file2
Mark

의존합니다. 더 간단하고 깔끔 할 수 있지만 소스 및 대상 데이터가 포함 된 익명 사전 목록과 같은 더 복잡한 데이터 구조를 사용하여 _items로 반복하여 수행 할 수 있습니다. 모든 언어에서 동일합니다. 판단을 내려야합니다. 위임 기능이 일련의 긴 복사 / 붙여 넣기 if 문보다 더 효율적이고 유지 관리가 쉬운 경우가 있습니다. 나는 길고 지루한 거의 동일한 지시문 목록보다 간결한 구조의 코드를 유지하려는 괴짜이지만 모든 사람이 동의한다고 가정하지는 않습니다. 당신을 위해 유지할 수있는 일을하십시오.
Paul Hodges

8

2.5 Ansible 때문에 with_*구조가 사용되지 않으며 , 그리고 loop구가 사용되어야한다. 간단한 실용적인 예 :

- name: Copy CA files
  copy:
    src: '{{item}}'
    dest: '/etc/pki/ca-trust/source/anchors'
    owner: root
    group: root
    mode: 0644
  loop:
    - symantec-private.crt
    - verisignclass3g2.crt


7
- hosts: lnx
  tasks:
    - find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
      register: file_to_copy
    - copy: src={{ item.path }} dest=/usr/local/sbin/
      owner: root
      mode: 0775
      with_items: "{{ files_to_copy.files }}"

것을 그냥 보조 노트 find모듈은 ansible 1.x에서 아닙니다 ansible 2.x에서 작동하지만
Arbab 나자르

stdout_lines반환 값에 언급 했지만 find모듈 에는 적용 할 수 없기 때문에 답변을 수정했습니다 . 그것은 단지가 files, examinedmatched반환 값으로. 그 도움이 다른 사람을 희망
Arbab 나자르에게

2
누구든지 원격 노드에 파일을 복사하기 위해이 작업을 수행 할 수 있었습니까? find관리 노드에서 아무것도 가져 오지 못하도록 원격 시스템 만 보는 것 같습니다. 을 사용하는 이러한 답변은 stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387with_fileglob 을 사용 하는 것이 더 적합 합니다.
Richlv

4

또는 with_items를 사용할 수 있습니다.

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_items:
    - dest_dir

3
- name: find inq.Linux*
  find:  paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
  register: find_files


- name: set fact
  set_fact:
    all_files:
      - "{{ find_files.files | map(attribute='path') | list }}"
  when: find_files > 0


- name: copy files
  copy:
    src: "{{ item }}"
    dest: /destination/
  with_items: "{{ all_files }}"
  when: find_files > 0

6
좋은 대답에는 코드뿐만 아니라 일부 설명이나 문서 참조도 포함됩니다.
Laurenz Albe

find, set_fact 및 copy 모듈은 모두 ansible 문서에 설명되어 있습니다. 이 섹션에 대해 더 자세히 알고 싶다면 ansible 문서에서도 설명 된 필터에 대해 읽어보십시오 (- "{{find_files.files | map (attribute'path ') | list}}")
Fredric Andersson

1

디렉토리 목록으로 변수를 반복 할 수 있습니다.

- name: Copy files from several directories
  copy:
    src: "{{ item }}"
    dest: "/etc/fooapp/"
    owner: root
    mode: "0600"
  loop: "{{ files }}"
  vars:
    files:
      - "dir1/"
      - "dir2/"

1

클라이언트 컴퓨터에서 여러 파일을 복사하려면 다음 소스 코드를 사용하십시오.


 - name: Copy data to the client machine
   hosts: hostname
   become_method: sudo
   become_user: root
   become: true
   tasks: 
     # Copy twice as sometimes files get skipped (mostly only one file skipped from a folder if the folder does not exist)
     - name: Copy UFO-Server 
       copy:
         src: "source files path"
         dest: "destination file path"
         owner: root
         group: root
         mode: 0644
         backup: yes
       ignore_errors: true

노트 :

변수를 사용하여 여러 경로를 전달하는 경우

src : "/ root / {{항목}}"

다른 항목에 대한 변수를 사용하여 경로를 전달하는 경우

src : "/ root / {{item.source_path}}"


0

copy모듈은 많은 파일 및 / 또는 디렉토리 구조를 복사하는 데 잘못된 도구입니다 . synchronize대신 모듈 rsync을 백엔드로 사용하십시오. rsync컨트롤러와 대상 호스트 모두에 설치 해야 합니다. 정말 강력 합니다 . ansible 문서를 확인 하세요 .

예- build컨트롤러의 디렉토리 (하위 디렉토리 포함) /var/www/html에서 대상 호스트 의 디렉토리로 파일 복사 :

synchronize:
  src: ./my-static-web-page/build/
  dest: /var/www/html
  rsync_opts:
    - "--chmod=D2755,F644" # copy from windows - force permissions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.