Ansible中shell和command的区别

80

我是 Ansible 新手,有人可以帮我理解 Ansible 中 shellcommand 的区别吗?什么时候使用 shell,什么时候使用 command

我知道 command 模块更安全,因为它不受用户环境的影响。


3
这个链接将提供有关模块之间差异的信息:https://blog.confirm.ch/ansible-modules-shell-vs-command/ - error404
4个回答

48

根据文档:

shell - 在目标上执行 shell 命令

它几乎与命令模块完全相同,但在远程节点上通过 shell (/bin/sh) 运行命令。

和:

command - 在目标上执行命令

命令将不会通过 shell 处理,因此像 $HOME 这样的变量和 "<", ">", "|", ";" 和 "&" 这样的操作将无法使用。如果需要这些功能,请使用 shell 模块。


2
如果在某些情况下,我能够同时使用两者,哪一个更受推荐? - Ahmed Hussein
9
command 命令提供更多的安全性(或所谓的隔离)。换句话说,你的命令执行不受用户环境变量的影响。而 shell 很类似于在终端上以你自己的身份执行命令。 - SilleBille

28
Ansible Shell模块允许您在远程主机上运行任意命令,就像您登录到shell一样。Shell和Command模块非常相似,主要区别在于Shell模块不会转义命令,允许您使用shell运算符,如重定向(“大于”,“小于”),管道(“|”)和布尔运算符(“&&”,“||”)。这意味着Shell模块容易受到命令注入/ shell注入的攻击,但是通过在Shell模块中使用“quote”过滤器来使用变量可以轻松解决这个问题。
参考: Ansible Shell模块教程-完整入门指南

1
ansible-lint文档中了解到command-instead-of-shell规则。
这个规则用于识别在不必要的情况下使用shell模块而不是command模块的情况。相比于command模块,shell模块的执行速度较慢,除非有特殊需要使用shell功能,如环境变量扩展或使用管道链接多个命令,否则应避免使用shell模块。

0
shell和command几乎是相同的。
 - name: copy or mv  within remote host
   command: cp /path/of/the/file/with/name /path/of/the/destination/directory/

在指定源文件路径时,请确保路径不以斜杠(/)结尾,并且目标路径以斜杠(/)结尾。
- name: rename within remote host 
  shell: chdir=/path/ mv file_name new_file_name

命令和Shell可以互换使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接