如何在ansible playbook任务中shell命令执行失败时仅打印stderr_行

如何在ansible playbook任务中shell命令执行失败时仅打印stderr_行,ansible,Ansible,在我的ansible playbook中,我有一个执行shell命令的任务。该命令的参数之一是password。当shell命令失败时,ansible将打印整个json对象,其中包括具有密码的命令。如果我使用了no\u log:True,那么我将得到经过审查的输出,并且无法获得stderr\u行。有没有办法在shell命令执行失败时自定义输出?您可以利用ansible及其错误处理功能 下面是一个示例剧本 --- -名称:shell的块演示 主机:本地主机 收集事实:错误 任务: -区块: -姓名

在我的ansible playbook中,我有一个执行
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