从代码块访问在异常处理块中定义的事实
我遇到了如下问题:如问题标题所述,我需要在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。