別讓通配符限制你的 Ansible Fetch 操作,這里有破解之道!
在工作中,我們經(jīng)常需要從多臺服務(wù)器上拉取日志文件。雖然ansible的fetch模塊看起來支持通配符,但實際使用中卻遇到了問題。這讓我有點困惑,但也促使我找到了更好的解決辦法。
問題復(fù)現(xiàn)
比如,我要在node1節(jié)點上拉取多個csv文件。按照直覺,我直接用了通配符:
ansible node1 -m fetch -a "src=/root/*.csv dest=./ flat=yes"
但結(jié)果卻是失?。?/p>
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) 把這些內(nèi)容保存成一個文件,比如叫fetch_csv.yml
(2) 在電腦上運行:
ansible-playbook fetch_csv.yml
這樣就搞定了!如下圖所示:
- 權(quán)限問題:確保ansible賬號在遠程服務(wù)器上有權(quán)限訪問這些文件
- 路徑問題:確認文件路徑和文件名是正確的,避免小錯誤導(dǎo)致失敗
小結(jié)
其實,這個方法不僅適用于csv文件,任何類型的文件都可以用同樣的方法批量拉取。希望這個方法能幫到你,解決批量拉取文件的困擾!