web-dev-qa-db-ja.com

Ansibleで複数のファイルをコピーする

1つのタスクでAnsibleを使って複数のファイルをリモートノードにコピーする方法を教えてください。

ファイルを定義するために自分のタスクでコピーモジュール行を複製しようとしましたが、最初のファイルだけがコピーされます。

70
Mark

これにはwith_fileglobループを使用できます。

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_fileglob:
    - /playbooks/files/fooapp/*
101
Arbab Nazar
- 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
84
guenhter

この目的のためにwith_togetherを使うことができます。

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

複数の場所が必要な場合は、複数の作業が必要です。 1つのコピータスクで、ノード上のある場所(複数のファイルを含む)から別の場所にしかコピーできません。

- 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/*
8
flxPeters
- 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 }}"
- 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
2

あるいはwith_itemsを使うこともできます。

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

copy moduleは多くのファイルやディレクトリ構造をコピーするための間違ったツールです。代わりにsynchronize moduleをバックエンドとして使うrsync moduleを使ってください。覚えておいて、それはrsyncがコントローラとターゲットホストの両方にインストールされている必要があります。本当に強力です、 ansible documentation をチェックしてください。

例 - コントローラの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
0
mrówa