【问题标题】:Unable to print ansible_failed_task.name in rescue block无法在救援块中打印 ansible_failed_task.name
【发布时间】:2020-04-17 15:55:52
【问题描述】:

以下是一段代码,它正在检索本地区域列表,并在任何一个本地区域未处于 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


【问题讨论】:

  • 如果您向我们展示/etc/ansible/playbooks/misc/test1404.yml 的第 23 行会更有帮助,因为我们无法猜测这些行中的哪一行是您文件中的第 23 行

标签: ansible


【解决方案1】:

嗯,那是一个绝对迷人的兔子洞。

因为在 ansible jinja2 中的模板是rendered recursively,当它尝试渲染包含失败模板的失败消息时,它会尝试重新渲染失败的模板,重新导致错误

这似乎通过包含 ansible_failed_task 变量来影响您,因为 -- 莫名其妙地 -- 在正文中包含 ansible_failed_result 似乎是安全的

我可以通过对 ansible 2.9.6 进行试验来判断,必须确定是否可以在接触之前安全地输出 a*_task 风味变量,因为我完全找不到 | string 或|regex_replace 或 anything 允许 jinja2 接触该变量,只要它包含虚假变量引用:

  - 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 的测试直接内联到when: 行可能是安全的,但由于它(应该)两次都产生相同的答案,因此没有很好的理由来评估两次


在我看来,这似乎是一个错误的错误,但我没有精力与他们的社区一起处理它 - 但是,我鼓励您与他们一起 file a bug

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2023-01-13
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多