别让通配符限制你的 Ansible Fetch 操作,这里有破解之道!

在工作中,我们经常需要从多台服务器上拉取日志文件。虽然ansible的fetch模块看起来支持通配符,但实际使用中却遇到了问题。这让我有点困惑,但也促使我找到了更好的解决办法。

问题复现

比如,我要在node1节点上拉取多个csv文件。按照直觉,我直接用了通配符:

复制
ansible node1 -m fetch -a "src=/root/*.csv dest=./ flat=yes"1.

但结果却是失败:

复制
the remote file does not exist, not transferring, ignored1.

这让我很疑惑:明明文件是存在的啊!

分步解决办法

其实,ansible的fetch模块对通配符的支持并不友好。通过实践,我找到了一个更可靠的方法,分两步就能解决问题:

(1) 先把远端的文件找出来

先用find模块在远端主机上搜索所有符合条件的文件。比如,我可以这样写:

复制
- name: 查找所有CSV文件 find: paths: /root/ patterns: "*.csv" recurse: yes register: csv_files1.2.3.4.5.6.

这就像是让ansible机器人帮我把所有符合条件的文件列出来。

(2) 一个一个拉回来

找到文件后,再把这些文件一个一个拉回来:

复制
- name:拉取找到的CSV文件 fetch: src:"{{ item.path }}" dest:"./" flat:yes loop:"{{ csv_files.files }}" when:csv_filesisdefinedandcsv_files.files|length> 01.2.3.4.5.6.7.

这样,ansible就会按顺序把所有找到的文件都拉到本地了。

怎么做呢?很简单!

(1) 把这些内容保存成一个文件,比如叫fetch_csv.yml

(2) 在电脑上运行:

复制
ansible-playbook fetch_csv.yml1.

这样就搞定了!如下图所示:

权限问题:确保ansible账号在远程服务器上有权限访问这些文件路径问题:确认文件路径和文件名是正确的,避免小错误导致失败小结

其实,这个方法不仅适用于csv文件,任何类型的文件都可以用同样的方法批量拉取。希望这个方法能帮到你,解决批量拉取文件的困扰!

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器