解決策 1:
これを行うには、同期モジュールを使用する必要があります。これは 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 またはデリゲートがソースです。プル モードでは、コンテキスト内のリモート ホストがソースです。
解決策 2:
おそらく、リモート コンテンツを登録する必要があり、それをループするよりも、次のように動作するはずです:
- 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/
で変更する必要があります マスター上のディレクトリで
解決策 3:
コメントするのに十分な担当者がいない場合は、追加します。
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 は、私が変更しなければならなかった領域でした。それ以外の場合、ファイルを見つけることができませんでした。
解決策 4:
上記の例を修正
- 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 }}"
解決策 5:
2.9.9 などの最新の ansible バージョンを使用している場合は、アイテムへの引用符が必要だと思います
- 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 }}"