web-dev-qa-db-ja.com

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

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

何か案は?

20
maayke

おそらく、リモートコンテンツを登録してループする必要があるでしょう。次のようなものが機能するはずです。

- 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/マスター上のディレクトリ

23
Kęstutis

これを行うには、 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パラメータです:

同期の方向を指定します。プッシュモードでは、ローカルホストまたはデリゲートがソースです。プルモードでは、コンテキスト内のリモートホストがソースです。

29
Duncan Lock

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

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は私が変更しなければならない領域でした。それ以外の場合はファイルを見つけることができませんでした。

5
JamStar

上記の例を修正する

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

まあ、もしあなたが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 }}"
1
Z.Liu
- 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.
  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

0
kmajumder