![Ansible:“shell”和“命令”模块之间的区别](https://linux22.com/image/153629/Ansible%EF%BC%9A%E2%80%9Cshell%E2%80%9D%E5%92%8C%E2%80%9C%E5%91%BD%E4%BB%A4%E2%80%9D%E6%A8%A1%E5%9D%97%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
Ansible 维基说:
给定的命令将在所有选定的节点上执行。它不会通过 shell 进行处理,因此像 $HOME 这样的变量和像<
、>
、|
、;
和 这样的操作&
将不起作用(如果需要这些功能,请使用 shell 模块)。
但在 Ansible 中它们之间没有区别:
[oracle@temp ansible]$ ansible temp2 -m shell -a "ls -la $HOME"
temp2 | CHANGED | rc=0 >>
total 40
drwx------. 6 oracle dba 4096 May 16 15:31 .
drwxr-xr-x. 3 root root 20 Mar 18 18:45 ..
drwx------. 3 oracle dba 17 May 16 15:31 .ansible
-rw-------. 1 oracle dba 8100 Apr 17 12:50 .bash_history
-rw-r--r--. 1 oracle dba 18 Aug 24 2018 .bash_logout
-rw-r--r--. 1 oracle dba 257 Mar 19 10:53 .bash_profile
-rw-r--r--. 1 oracle dba 231 Aug 24 2018 .bashrc
drwx------. 3 oracle dba 16 Mar 22 12:19 .cache
drwx------. 4 oracle dba 28 Mar 22 12:19 .config
drwx------. 3 oracle dba 19 Mar 22 12:19 .local
-rw-------. 1 oracle dba 10425 Apr 16 14:50 .psql_history
-rw-------. 1 oracle dba 713 Mar 19 11:15 .viminfo
[oracle@temp ansible]$ ansible temp2 -m command -a "ls -la $HOME"
temp2 | CHANGED | rc=0 >>
total 40
drwx------. 6 oracle dba 4096 May 16 15:31 .
drwxr-xr-x. 3 root root 20 Mar 18 18:45 ..
drwx------. 3 oracle dba 17 May 16 15:31 .ansible
-rw-------. 1 oracle dba 8100 Apr 17 12:50 .bash_history
-rw-r--r--. 1 oracle dba 18 Aug 24 2018 .bash_logout
-rw-r--r--. 1 oracle dba 257 Mar 19 10:53 .bash_profile
-rw-r--r--. 1 oracle dba 231 Aug 24 2018 .bashrc
drwx------. 3 oracle dba 16 Mar 22 12:19 .cache
drwx------. 4 oracle dba 28 Mar 22 12:19 .config
drwx------. 3 oracle dba 19 Mar 22 12:19 .local
-rw-------. 1 oracle dba 10425 Apr 16 14:50 .psql_history
-rw-------. 1 oracle dba 713 Mar 19 11:15 .viminfo
是什么原因?
答案1
您正在用双引号传递参数。$HOME
由本地计算机上的 shell 扩展,ansible 甚至看不到它。如果您改用单引号,您应该能够看到差异。 (您还会注意到远程计算机上是否不存在该路径。)
答案2
从ansible-lint的文档命令代替 shell规则。
此规则在不需要时识别
shell
模块的使用,而不是识别单个模块。 Shell 比命令慢得多,除非有特殊需要使用 shell 功能(如环境变量扩展或使用管道链接多个命令),否则应避免使用。command