Ansible 提供了大量的模塊(All Modules)供執(zhí)行 AD-Hoc 和撰寫 playbook。 有些模塊有很多通用性, 但設(shè)計為多個還是有部分區(qū)別的。
shell vs. command
一個典型的例子就是 shell 和 command 模塊. 這兩個模塊在很多情況下都能完成同樣的工作, 以下是兩個模塊之前的區(qū)別:
- command 模塊命令將不會使用 shell 執(zhí)行. 因此, 像
$HOME這樣的變量是不可用的。還有像<,>,|,;,&都將不可用。 - shell 模塊通過shell程序執(zhí)行, 默認是
/bin/sh,<,>,|,;,&可用。但這樣有潛在的 shell 注入風(fēng)險, 后面會詳談. - command 模塊更安全,因為他不受用戶環(huán)境的影響。 也很大的避免了潛在的 shell 注入風(fēng)險.
結(jié)論
結(jié)論是兩個模塊都要避免使用, 你應(yīng)該優(yōu)先考慮更具體的 ansible 模塊。 比如用 command 或者 shell 執(zhí)行 yum 命令前, 應(yīng)該先了解到直接的 yum 模塊。使用具體模塊比執(zhí)行命令要優(yōu)雅很多, 因為這些模塊設(shè)計都是具有冪等性的, 并滿足其他標(biāo)準(zhǔn), 如異常處理等.
如果沒有更具體的模塊, 相對來說 command 更安全點。
如果您需要用戶環(huán)境和流式操作,則只能使用 shell 模塊,但您要小心。 請記住 ansible 官方給出的提示, 如果將 shell 模塊和變量一起使用:
To sanitize any variables passed to the shell module, you should use “{{ var | quote }}” instead of just “{{ var }}” to make sure they don’t include evil things like semicolons.)
即: 如果你需要安全的使用帶有變量的 shell 模塊, 使用
{{ var | quote }}代替{{ var }}, 確保輸入不包含分號或者流式操作.