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


103

タスクで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

114
- 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 2017年

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

複数の場所が必要な場合は、複数のタスクが必要です。1つのコピータスクは、ノード上の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/*

-名前:コピーfile1コピー:src = / file1 dest = / destination / file1-名前:コピーfile2コピー:src = / file2 dest = / destination / file2
マーク

依存します。シンプルでクリーンである可能性が高いですが、with_itemsでループされるソースデータとターゲットデータを持つ匿名辞書のリストなど、より複雑なデータ構造を使用して実行できます。それはどの言語でも同じです-あなたは判断を下さなければなりません。委任機能は、長い一連のコピー/貼り付けられたifステートメントよりも効率的で保守しやすい場合があります。私は、ほぼ同一のディレクティブの長くて面倒なリストよりも、うまく構造化されたコードの簡潔なビットを維持するのが好きなフリークですが、全員が同意するとは思いません。あなたのために維持できることをしてください。
ポールホッジス2018

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 2.xでのみ機能し、ansible 1.xでは機能しません
Arbab Nazar

stdout_lines戻り値でに言及しているため、回答を修正しましたが、findモジュールには適用されません。それが唯一持っているfilesexaminedmatched戻り値として。他の人を助けることを願っています
Arbab Nazar

2
誰かがこれを機能させてファイルをリモートノードにコピーできましたか?findリモートシステムのみを表示しているように見え、管理ノードから何かを取得することはできません。使用してこれらの答えは、with_fileglobよりフィットしているように見える:stackoverflow.com/a/42290160/272387stackoverflow.com/a/36720342/272387
Richlv 2017年

7

Ansible 2.5以降では、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


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
適切な答えには、コードだけでなく、いくつかの説明やドキュメントの参照も含まれます。
ローレンツアルベ2018

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 / {{item}}"

異なるアイテムの変数を使用してパスを渡す場合、

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


0

copymoduleは、多くのファイルやディレクトリ構造をコピーするための誤ったツールです。synchronize代わりにrsync、バックエンドとして使用するmoduleを使用してください。ご注意ください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.