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

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

我想使用 Ansible 将文件从远程目录复制到本地目录,但获取模块只允许我复制一个文件。我有许多需要文件(每个服务器的目录相同)的服务器,但我不知道如何使用 Ansible 执行此操作。

有任何想法吗?

答案1

您可能需要注册远程内容然后循环遍历它,类似这样的操作应该可以工作:

- 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/主服务器上的目录进行更改

答案2

你应该使用同步模块做到这一点。这利用了同步它将复制任意深度的文件和目录结构,可靠且高效 - 仅复制实际发生变化的字节:

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

关键是mode参数:

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

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

好吧,如果你使用的是最新的 ansible 版本,比如 2.9.9,我认为我们需要对该项目进行引号

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

相关内容