在可玩的Playbook任务中,当Shell命令执行失败时,如何仅输出stderr_lines

时间:2019-09-13 09:10:44

标签: ansible

在我的ansible剧本中,我有一个执行shell命令的任务。该命令的参数之一是密码。当shell命令失败时,ansible会打印出整个json对象,其中包括具有密码的命令。如果我使用no_log: True,那么我将检查输出,而无法获得stderr_lines。当shell命令执行失败时,是否可以自定义输出?

2 个答案:

答案 0 :(得分:3)

您可以利用ans blocks及其错误处理功能。

这是一个示例剧本

---
- name: Block demo for shell
  hosts: localhost
  gather_facts: false

  tasks:

    - block:

        - name: my command
          shell: my_command is bad
          register: cmdresult
          no_log: true

      rescue:

        - name: show error
          debug:
            msg: "{{ cmdresult.stderr }}"

        - name: fail the playbook
          fail:
            msg: Error on command. See debug of stderr above

给出以下结果:

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

答案 1 :(得分:1)

您可以利用这样的东西:

- 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将被写入文件。如果失败,则可以检查文件并对其进行调试,如果成功,则将删除文件。