无法在救援块中打印ansible_failed_task.name

时间:2020-04-17 15:55:52

标签: ansible

以下是一段代码,该代码正在检索本地区域的列表,并在任何一个本地区域未处于RUNNING状态时尝试进入救援块。

但是救援块失败,位于“检查区域是否处于运行状态”

期望是发送带有任务名称的电子邮件。但这可以很好地处理其他失败的任务。有人可以指导吗?

失败! => {“ msg”:“该任务包含带有未定义变量的选项。错误为:'item'未定义\ n \ n错误似乎在'/etc/ansible/playbooks/misc/test1404.yml'中:第23行第9列,但根据确切的语法问题,可能\ n在文件的其他位置。\ n \ n出现问题的行似乎是:\ n \ n救援:\ n-名称:从Ansible发送电子邮件控制器节点\ n ^这里\ n“}

    - '{{ host }}'
  tasks:
   - block:
      - name: Retrieve list of local zones
        shell: /usr/sbin/zoneadm list | grep -v global   
        register: lzones      
        tags: 
          - local_zone_list
      - debug:
           msg: "{{ item }}"
        with_items: "{{lzones.stdout_lines}}"

      - name: Check if the zones are in running state
        shell: /usr/sbin/zoneadm list | grep -v global | grep "{{ item }}" | awk '{print$3}'
        register: status
        with_items: "{{lzones.stdout_lines}}"
        failed_when: status.stdout.find('running') == -1


        < few other tasks>

     rescue:
      - name: Sending an e-mail from Ansible controller node
        mail:
            host: localhost
            port: 25
            to: xyz@abc.com
            subject: Reboot Failed
            body: Reboot FAILED at TASK - {{ ansible_failed_task.name }} with ERROR {{ ansible_failed_result }}
        delegate_to: localhost


1 个答案:

答案 0 :(得分:0)

那真是个令人着迷的兔子洞。

因为在可使用的jinja2模板中有rendered recursively,当它尝试呈现包含失败模板的失败消息时,它会尝试重新呈现失败模板,导致错误

似乎似乎会因为包含ansible_failed_task变量而对您造成影响,因为-莫名其妙地-将ansible_failed_result包含在体内似乎是安全的< / p>

通过对ansible 2.9.6的试验,我可以最好地看出,必须确定在触摸之前是否可以安全地输出a*_task风味变量,因为我完全无法找到{{ 1}}或| string任何,只要jinja2包含伪造的变量引用,它就可以触摸该变量:

|regex_replace

- block: - debug: msg: this explodes {{ nope_not_a_var }} rescue: - set_fact: is_undefined_error: '{{ "undefined variable" in ansible_failed_result.msg }}' - name: variable is unsafe version debug: msg: >- failed task action has an undefined variable in the task, so we cannot show you the task, but here is the result: {{ ansible_failed_result }} when: is_undefined_error - name: variable is safe to output version debug: msg: Reboot FAILED at TASK - {{ ansible_failed_task.name }} with ERROR {{ ansible_failed_result }} when: not is_undefined_error 的测试直接内联到"..." in ansible_failed_result.msg行中可能是安全的,但是由于它(应该)两次都产生相同的答案,所以没有真正的答案有足够的理由对其进行两次评估


在我看来,这是一个烦人的错误,但是我没有足够的精力去与他们的社区接轨-但是,我鼓励您file a bug与他们一起