从代码块访问在异常处理块中定义的事实

后端开发 2026-07-10

我遇到了如下问题:如问题标题所述,我需要在block块中访问位于rescue部分定义的 refresh_token 事实变量,以继续执行任务(对REST API的调用)。根据文档,目前没有办法做到这一点,因此我的问题是,是否有办法在token刷新后消除 rescue 部分的代码重复?

以下是当前的任务工作流程。

---
- block:

  - name: Get sites from api
    ansible.builtin.uri:
      url: "{{ central_base_url }}/network-monitoring/v1/sites-health"
      headers:
        Authorization: Bearer {{ central_access_token }}
        Accept: application/json
      method: GET
      status_code: [200, 401]
    register: central_sites_response

  - name: Get devices per site
    ansible.builtin.uri:
      url: "{{ central_base_url }}/network-monitoring/v1/aps?filter=siteId eq {{ siteId | urlencode}}"
      method: GET
      headers: 
        Authorization: Bearer {{ central_access_token }}
        Accept: application/json
      status_code: [200, 401]
    register: central_devices_response

  - name: Debug devices
    ansible.builtin.debug:
      var: central_devices_response

  rescue:

    - name: Refresh token
      ansible.builtin.uri:
        method: POST
        status_code: 200
        headers:
          Accept: application/json
          Content-Type: application/x-www-form-urlencoded
        payload:
          grant_type: client_credentials
          client_id: "{{ client_id }}"
          client_secret: "{{ client_secret }}"
      register: central_token_response

    - name: Store refreshed token
      ansible.builtin.set_fact:
        access_token: "{{ token_response.json.access_token }}"

解决方案

似乎对任务执行流程的理解有误。

下面是一个最小示例的playbook

---
- hosts: localhost
  become: false
  gather_facts: false

  tasks:

    - block:

        - name: Show access_token
          debug:
            msg: "Since variable is {{ access_token | default('NOT DEFINED') }} currently!"
          failed_when: not access_token is defined

      rescue:

        - name: Define access_token
          set_fact:
            access_token: "TEST"

        - name: Show access_token
          debug:
            msg: "{{ access_token }}"

生成的输出为

TASK [Show access_token] **********************
fatal: [localhost]: FAILED! =>
  msg: Since variable is NOT DEFINED currently!

TASK [Define access_token] ********************
ok: [localhost]

TASK [Show access_token] **********************
ok: [localhost] =>
  msg: TEST

请参阅 用blocks处理错误

Rescue块在同一个块中较早的任务失败时指定要执行的任务。 ... Ansible只有在任务返回一个 failed 状态后,才会执行Rescue块。

你所提出的需求按你现在的做法,是不可行的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章