该可玩的剧本中的raw
,shell
和command
有什么区别?以及何时使用哪个?
答案 0 :(得分:3)
command:与其他剧本任务的外壳相同,在目标主机上执行远程命令。
它可以用于启动脚本(.sh)或执行简单的命令。例如:
- name: Cat a file
command: cat somefile.txt
- name: Execute a script
command: somescript.sh param1 param2
shell:在目标主机上执行远程命令,打开新的外壳程序(/ bin / sh)。
如果要执行更复杂的命令(例如与管道连接的命令),可以使用它。例如:
- name: Look for something in a file
shell: cat somefile.txt | grep something
raw:在目标主机上缺少解释器的情况下执行低级命令,常见的用例是安装python。请勿在其他所有情况下(建议使用命令和shell)使用此模块
答案 1 :(得分:1)
由于我一直在讨论相同的问题,所以我也想在这里分享我的发现。
command
和shell
模块以及gather_facts
取决于远程主机上正确安装的Python解释器。如果未满足该要求,则可能无法执行
python <ansiblePython.py>
在Debian 10(Buster)的最小安装中,即安装了python3
,但缺少指向python
的符号链接。
为了在应用所有其他角色之前正确地初始化系统,我对raw
模块使用了一种方法
ansible / initSrv / main.yml
- hosts: "{{ target_hosts }}"
gather_facts: no
pre_tasks:
- name: "Make sure remote system is initialized correctly"
raw: 'ln -s /usr/bin/python3 /usr/bin/python'
register: set_symlink
failed_when: set_symlink.rc != 0 and set_symlink.rc != 1
正在做类似的事情
/bin/sh -c 'ln -s /usr/bin/python3 /usr/bin/python'
在远程系统上。