Ansibleで複数のファイルをリモートマシンからローカルに取得する方法


17

Ansibleを使用してリモートディレクトリからローカルディレクトリにファイルをコピーしたいのですが、フェッチモジュールでは1つのファイルしかコピーできません。ファイルが必要なサーバーが多数あり(各サーバーで同じディレクトリ)、Ansibleでこれを行う方法は今はありません。

何か案は?

回答:


22

リモートコンテンツを登録し、ループするよりも、おそらく次のように動作するはずです。

- 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/マスター上のディレクトリで変更する必要がある場所


1
ちなみに、これは1レベルだけ深く(サブディレクトリを除外)し、一般的にディレクトリを無視するので、それが望んでいない場合は、シェルコマンドを変更するだけです。
ケーストゥティス

多数のサーバーで実行するとどうなりますか?それぞれが独自の調査結果を登録しますか?正しいものを取得しますか?
アミールメラー

win_findでこれを行う方法の手がかりはありますか?返されるファイルリストからパスを追加する方法がわからない
Peter Kahn

27

これを行うには、同期モジュールを使用する必要があります。これは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またはデリゲートがソースです。プルモードでは、コンテキスト内のリモートホストがソースです。


1
このsynchroniseモジュールは、ansibleがファイルをコピーする他の方法よりもはるかに信頼性が高く、スケーラブルであることがわかりました。

3
これは、受け入れられた答えよりも間違いなく良い方法です。
childofsoong 16

5

コメントするのに十分な担当者がいなければ、追加します。

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は、変更しなければならなかった領域でした。そうでなければ、ファイルを見つけることができませんでした。


2

上記の例を修正する

- 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 }}"

1

まあ、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 }}"


0

これを使用します。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.
  1. ノードからローカルホストにディレクトリをプルします
- 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.