使用Ansible通过通配符搜索目录并复制其内容

我想做的事情

跟标题一样。
我开始尝试在不使用command模块和shell模块的情况下完成这个!

方法 (Yarikata)

只是这个而已,但却出乎意料地费了些周折…

- name: ディレクトリを探す
  find:
    paths: /hogehoge/
    patterns: "copy*"
    file_type: directory
  register: find_result

- name: 中身をコピー
  synchronize:
    src: "{{ item.path }}/"
    dest: /fugafuga/copyto/
  with_items: "{{ find_result.files }}"
  delegate_to: "{{ inventory_hostname }}"

简单说明

找目录

首先,使用find模块查找目录。
https://docs.ansible.com/ansible/latest/modules/find_module.html

我正在寻找例子中的/hogehoge/copy*文件夹,并将结果存储在find_result中。

复制内容

使用 synchronize 模块进行复制。
https://docs.ansible.com/ansible/latest/modules/synchronize_module.html

在例子中,我们预先查找了目录的内容,并将其复制到/fugafuga/copyto/以及其下子目录中。

同步模块是一个将本地同步到远程的模块,使用delegate_to关键字可以在远程内同步(从远程到远程)。
inventory_hostname是正在处理的远程的名称。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html#delegation

复制的源路径存储在find_result.files.path中,但是由于files是一个数组,因此我们将使用 with_items 逐个提取并进行处理。
https://docs.ansible.com/ansible/2.4/playbooks_loops.html#using-register-with-a-loop

总结

命令模块和Shell模块非常强大,但是我们希望将它们作为最后的手段。
实际上,最初我是用命令模块来实现的,但在重构时遇到了麻烦!这是一个案例。
为了发挥Ansible的优势,我们应该尽量采用类似Ansible的实现方法。

广告
将在 10 秒后关闭
bannerAds