如何在ansible playbook任务中shell命令执行失败时仅打印stderr_行
在我的ansible playbook中,我有一个执行如何在ansible playbook任务中shell命令执行失败时仅打印stderr_行,ansible,Ansible,在我的ansible playbook中,我有一个执行shell命令的任务。该命令的参数之一是password。当shell命令失败时,ansible将打印整个json对象,其中包括具有密码的命令。如果我使用了no\u log:True,那么我将得到经过审查的输出,并且无法获得stderr\u行。有没有办法在shell命令执行失败时自定义输出?您可以利用ansible及其错误处理功能 下面是一个示例剧本 --- -名称:shell的块演示 主机:本地主机 收集事实:错误 任务: -区块: -姓名
shell
命令的任务。该命令的参数之一是password。当shell命令失败时,ansible将打印整个json对象,其中包括具有密码的命令。如果我使用了no\u log:True
,那么我将得到经过审查的输出,并且无法获得stderr\u行。有没有办法在shell命令执行失败时自定义输出?您可以利用ansible及其错误处理功能
下面是一个示例剧本
---
-名称:shell的块演示
主机:本地主机
收集事实:错误
任务:
-区块:
-姓名:我的命令
我的命令不好
注册:cmdresult
没有日志:正确
救援:
-名称:显示错误
调试:
msg:“{cmdresult.stderr}}”
-名称:失败的剧本
失败:
msg:命令错误。请参阅上面的stderr调试
结果如下:
PLAY [Block demo for shell] *********************************************************************************************************************************************************************************************************************************************
TASK [my command] *******************************************************************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result", "changed": true}
TASK [show error] *******************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "/bin/sh: 1: my_command: not found"
}
TASK [fail the playbook] ************************************************************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error on command. See debug of stderr above"}
PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=1 ignored=0
您可以使用以下内容:
- name: Running it
hosts: localhost
tasks:
- name: failing the task
shell: sh a.sh > output.txt
ignore_errors: true
register: abc
- name: now failing
command: rm output.txt
when: abc|succeeded
stdout将被写入一个文件。如果失败,您可以检查并调试该文件,如果成功,则将删除该文件。否。无法自定义该文件并选择性地检查部分命令。将纯文本密码放在命令行中是一种不好的做法。密码通过Ansible vault进行加密,但在此场景中使用之前先解密。block-rescue是一个好主意。小心,带有密码的注册变量将在hostvars
中可用。(我的2美分)可能是生成出错shell的更好方法:shell:>&2 echo“这是一条示例消息”&&&/bin/false
:)@VladimirBotka+1但这里,密码可能已经在剧本YAML中了(如果不是拱顶的话)有趣的想法。让我试一试。@β.εηοιτ.βε密码被保险存储,但在执行命令时变量被替换。另一种可能是重新构造脚本和剧本,以完全不将密码作为命令参数发送。很有趣,谢谢。唯一的问题是密码仍然存在。但是,在打印适当的文本之后,可以读取文件内容并删除。我会认为这是一个更大的风险,如果在创建/删除文件过程中间的某个脚本失败了,那么在远程主机上留下一个包含您的密码的文件…如果这样做有效的话,使输出静音可能是一个解决方案。shell:sh a.sh>/dev/null