ansible 'raw'、'shell' 和 'command' 之间有什么区别?

Ren*_* B. 1 ansible

ansible playbook 中的raw,shell和 有什么区别command?什么时候使用哪个?

小智 9

command:在目标主机上执行远程命令,在其他 playbook 的任务的同一个 shell 中。
它可用于启动脚本 (.sh) 或执行简单命令。例如:

- name: Cat a file
  command: cat somefile.txt

- name: Execute a script
  command: somescript.sh param1 param2
Run Code Online (Sandbox Code Playgroud)

shell : 在目标主机上执行远程命令,打开一个新的 shell (/bin/sh)。
如果您想执行更复杂的命令,例如与管道连接的命令,则可以使用它。例如:

- name: Look for something in a file
  shell: cat somefile.txt | grep something
Run Code Online (Sandbox Code Playgroud)

raw : 在目标主机上缺少解释器的情况下执行低级命令,一个常见的用例是安装 python。不应在所有其他情况下使用此模块(建议使用 command 和 shell)


U88*_*80D 6

由于我遇到了同样的问题,我也想在这里分享我的发现。

\n

command和模块(注释:)shell也依赖于远程节点上正确安装的 Python 解释器。如果未满足该要求,则可能会遇到无法执行的错误gather_factssetup.py

\n
python <ansiblePython.py>\n
Run Code Online (Sandbox Code Playgroud)\n

在 Debian 10 (Buster) 最小安装中,python3即已安装,但符号链接python丢失。

\n

为了在应用所有其他角色之前正确初始化系统,我使用了模块的raw方法

\n

ansible/initSrv/main.yml

\n
- hosts: "{{ target_hosts }}"\n  gather_facts: no # is necessary because setup.py depends on Python too\n\n  pre_tasks:\n  - name: "Make sure remote system is initialized correctly"\n    raw: \'ln -s /usr/bin/python3 /usr/bin/python\'\n    register: set_symlink\n    failed_when: set_symlink.rc != 0 and set_symlink.rc != 1 \n
Run Code Online (Sandbox Code Playgroud)\n

这是在做类似的事情

\n
/bin/sh -c \'ln -s /usr/bin/python3 /usr/bin/python\'\n
Run Code Online (Sandbox Code Playgroud)\n

在远程系统上。

\n

进一步的文档

\n\n

...但不仅限于此

\n\n

另一个用例

\n\n