Ansible ad-hoc的command和shell模塊的區別

Ansible中有一個很重要的功能就是可以執行ad-hoc命令,可能有些人不懂ad-hoc這個詞的意思,它表示即時的意思,或者說隨意的意思。

與之相對的是ansible playbook功能,playbook適用於批量部署環境,一般不用經常改動。而ad-hoc命令適用於業務變更等操作場景,比如批量部署一個配置文件,重啓某個服務,安裝一些包等。

ad-hoc命令中有兩個模塊:command, shell。很多人不知道他們的區別是什麼,其實很簡單。


你在終端輸入一條ad-hoc命令後,ansible會生成一個可執行python腳本文件,然後把它拷貝到遠程機器上執行,這個腳本中包含了命令行的所有信息。

如果你用的是command或shell模塊,那麼腳本中調用的是subprocess.Popen(args,*kwargs)函數,command和shell的區別就在於command模塊使用shell=True,而shell模塊使用shell=False,就是一個調用了shell,一個沒有。

官方文檔中是不建議使用shell=True的,因爲這可能導致shell injection安全問題,但是有些情況下用shell模塊就很方便,比如我要批量刪除一些文件, 

ansible -i inventory all -m command -a "rm -f /etc/yum.repos.d/CentOS*.repo" -U root -s -f 50 -kK

你如果執行以上命令的話,是不會刪除掉那些文件的,爲什麼?

因爲你的命令行中包含了通配符*號,通配符必須要有在shell環境中才能被識別出,不然,它只能刪除CentOS*.repo這一個文件。

所以你需要執行以下命令才能成功

ansible -i inventory all -m shell -a "rm -f /etc/yum.repos.d/CentOS*.repo" -U root -s -f 50 -kK

而這兩個命令所生成的可執行腳本的區別就一行

< MODULE_ARGS = 'rm -f /etc/yum.repos.d/CentOS*.repo'

---

> MODULE_ARGS = 'rm -f /etc/yum.repos.d/CentOS* #USE_SHELL'


看到這裏,想必已經讓你清晰很多了吧!

有問題可以發表評論!


推薦一個非常好的關於容器技術的公衆號,有興趣的可以關注!

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章