ansible 中shell 模塊和command 模塊的區別

Ansible中有一個很重要的功能就是能夠執行ad-hoc命令,可能有些人不懂ad-hoc這個詞的意思,它表示即時的意思,或者說隨意的意思。
與之相對的是ansible playbook功能,playbook適用於批量部署環境,通常不用常常改動。而ad-hoc命令適用於業務變動等操做場景,好比批量部署一個配置文件,重啓某個服務,安裝一些包等。
ad-hoc命令中有兩個模塊:command, shell。不少人不知道他們的區別是什麼,其實很簡單。html

你在終端輸入一條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'python

例如:
[root@master tmp]# ansible slave -m command -a "rm -f /tmp/test*" -U root -s -f 50 -kK
SSH password:
SUDO password[defaults to SSH password]:
client02 | SUCCESS | rc=0 >>shell

client01 | SUCCESS | rc=0 >>安全

[root@client01 tmp]# ls
test0001 test.sh txt01 yum.logruby

[root@client02 tmp]# ls
test0001 test.sh txt01 yum.logide

[root@master tmp]# ansible slave -m shell -a "rm -f /tmp/test*" -U root -s -f 50 -kK
SSH password:
SUDO password[defaults to SSH password]:
client01 | SUCCESS | rc=0 >>函數

client02 | SUCCESS | rc=0 >>
[root@client01 tmp]# ls
txt01 yum.log
[root@client02 tmp]# ls
txt01 yum.log命令行

以上就是shell 和command的區別
看到這裏,想必已經讓你清晰不少了吧!htm

http://www.cnblogs.com/hemhem/archive/2011/03/14/2087482.htmlblog

http://www.ruby-lang.org/en/downloads/

相關文章
相關標籤/搜索