我的剧本中有一项任务是终止所有给定名称的进程:
- name: stop twd if running
#shell: ps auxww | grep 'twd' | awk '{print $2}' | xargs kill -9
shell: pkill pwd
become: yes
ignore_errors: yes
它返回非零代码,并且调试模式没有告诉我失败的原因,它只说:
"invocation": {
"module_args": {
"_raw_params": "pkill twd",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"msg": "non-zero return code", ...
为什么当运行命令的用户为真时它会失败,而当我在远程计算机上运行相同的命令时,它会正常工作。从文档中可以看出,“shell”任务的工作方式与通过远程计算机上的 shell 运行命令完全相同,为什么它会失败?它可以执行其他命令,但无法执行我发送的终止进程的命令。
这是在远程计算机上运行命令的结果,返回退出代码 0:
root@mos:~# pkill twd
root@mos:~# echo $?
0
类似的问题,这里,建议我们在使用管道或需要访问环境变量时使用“shell”而不是“command”,它还建议如果这不是真正的失败,则添加 ignore_error。我使用了 shell 和上面使用管道的注释任务,但它不起作用,甚至在使用不包含任何管道的“pkill”命令后,它也会失败。