Ansibleを使用してリモートディレクトリからローカルディレクトリにファイルをコピーしたいのですが、フェッチモジュールでは1つのファイルしかコピーできません。多くのサーバーからファイルが必要です(各サーバーで同じディレクトリ)。Ansibleでこれを行う方法は今はしません。
何か案は?
おそらく、リモートコンテンツを登録してループする必要があるでしょう。次のようなものが機能するはずです。
- 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/
マスター上のディレクトリ
これを行うには、 synchronise module を使用する必要があります。これは 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
パラメータです:
同期の方向を指定します。プッシュモードでは、ローカルホストまたはデリゲートがソースです。プルモードでは、コンテキスト内のリモートホストがソースです。
コメントするのに十分な担当者がいないので、コメントを追加します。
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は私が変更しなければならない領域でした。それ以外の場合はファイルを見つけることができませんでした。
上記の例を修正する
- 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 }}"
まあ、もしあなたが2.2.1.0のような最新の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 }}"
- 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
私はこれを使用します: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.
- 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