如何使用Ansible将多个文件从远程计算机获取到本地


17

我想使用Ansible将文件从远程目录复制到本地目录,但是获取模块仅允许我复制一个文件。我有许多服务器需要文件(每个服务器都在同一目录中),而现在我不知道如何使用Ansible做到这一点。

有任何想法吗?

Answers:


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
顺便说一句,这只深入了一层(删除了子目录),并且通常会忽略目录,因此,如果您不希望这样做,只需相应地更改shell命令即可。
凯斯图蒂斯

当我在一堆服务器上运行时会发生什么?每个人都会记录自己的发现吗?并获取合适的?
阿米尔·梅勒

任何线索如何用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参数:

指定同步的方向。在推模式下,本地主机或委托是源;在拉模式下,上下文中的远程主机是源。


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

好吧,如果您使用的是最新的ansible版本(例如2.2.1.0),我认为我们需要对此商品加引号

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

这根本不起作用。已经尝试过了吗?
罗勒

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.