在工作中,我们经常需要从多台服务器上拉取日志文件。虽然ansible的fetch模块看起来支持通配符,但实际使用中却遇到了问题。这让我有点困惑,但也促使我找到了更好的解决办法。
问题复现
比如,我要在node1节点上拉取多个csv文件。按照直觉,我直接用了通配符:
ansible node1 -m fetch -a "src=/root/*.csv dest=./ flat=yes"
但结果却是失败:
the remote file does not exist, not transferring, ignored
这让我很疑惑:明明文件是存在的啊!
分步解决办法
其实,ansible的fetch模块对通配符的支持并不友好。通过实践,我找到了一个更可靠的方法,分两步就能解决问题:
(1) 先把远端的文件找出来
先用find模块在远端主机上搜索所有符合条件的文件。比如,我可以这样写:
- name: 查找所有CSV文件
find:
paths: /root/
patterns: "*.csv"
recurse: yes
register: csv_files
这就像是让ansible机器人帮我把所有符合条件的文件列出来。
(2) 一个一个拉回来
找到文件后,再把这些文件一个一个拉回来:
- name:拉取找到的CSV文件
fetch:
src:"{{ item.path }}"
dest:"./"
flat:yes
loop:"{{ csv_files.files }}"
when:csv_filesisdefinedandcsv_files.files|length> 0
这样,ansible就会按顺序把所有找到的文件都拉到本地了。
怎么做呢?很简单!
(1) 把这些内容保存成一个文件,比如叫fetch_csv.yml
(2) 在电脑上运行:
ansible-playbook fetch_csv.yml
这样就搞定了!如下图所示:
- 权限问题:确保ansible账号在远程服务器上有权限访问这些文件
- 路径问题:确认文件路径和文件名是正确的,避免小错误导致失败
小结
其实,这个方法不仅适用于csv文件,任何类型的文件都可以用同样的方法批量拉取。希望这个方法能帮到你,解决批量拉取文件的困扰!