使用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的实现方法。