字数 716,阅读大约需 4 分钟
关于如何用ansible
批量拉取远端的日志文件,这里分享一个实用的解决方案在工作中,我们经常需要从多台服务器上拉取日志文件。虽然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:yesregister:csv_files
这就像是让ansible
机器人帮我把所有符合条件的文件列出来。2. 一个一个拉回来
找到文件后,再把这些文件一个一个拉回来:
-name:拉取找到的CSV文件fetch:src:"{{ item.path }}"dest:"./"flat:yesloop:"{{ csv_files.files }}"when:csv_filesisdefinedandcsv_files.files|length>0
这样,ansible
就会按顺序把所有找到的文件都拉到本地了。
怎么做呢?很简单!
-
1. 把这些内容保存成一个文件,比如叫 fetch_csv.yml
-
2. 在电脑上运行:
ansible-playbook fetch_csv.yml
这样就搞定了!如下图所示:
• 权限问题:确保 ansible
账号在远程服务器上有权限访问这些文件• 路径问题:确认文件路径和文件名是正确的,避免小错误导致失败
小结
其实,这个方法不仅适用于csv文件,任何类型的文件都可以用同样的方法批量拉取。希望这个方法能帮到你,解决批量拉取文件的困扰!
原文始发于微信公众号(攻城狮成长日记):别让通配符限制你的Ansible Fetch操作,这里有破解之道!
原文始发于微信公众号(攻城狮成长日记):别让通配符限制你的Ansible Fetch操作,这里有破解之道!
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论