You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中从vRA API返回的字典获取指定ID值

Ansible 从vRA API返回结果中提取指定描述对应的Action ID

我看你现在的问题是要从vRA API返回的JSON里,找到描述为"Reboot a machine."对应的ID,原代码没达到预期,我帮你分析下问题,再给你两种可行的解决方案。

先说说原代码的问题

  1. 语法与逻辑错误:你用with_sequence遍历索引的方式不仅不够直观,而且when条件里的写法有问题——Ansible在条件判断里不需要用{{ }}包裹变量,直接写表达式就行。另外register的用法完全错了,它是用来保存整个任务的执行结果的,不能直接把值写到actions.json.content里,应该用set_fact来定义新变量。
  2. 匹配关键词不对:你原代码里匹配的是"Delete a snapshot of this machine.",但你实际要找的是"Reboot a machine.",这肯定找不到你要的ID啊!

解决方案一:用json_query快速筛选(推荐)

Ansible支持JMESPath语法的json_query过滤器,能直接从JSON数组里精准筛选数据,写法非常简洁:

- name: 调用vRA API获取Actions列表
  uri:
    url: "你的vRA API地址"
    method: GET
    headers:
      Authorization: "Bearer {{ 你的认证Token }}"
    return_content: yes
  register: actions

- name: 提取"Reboot a machine."对应的ID
  set_fact:
    reboot_action_id: "{{ actions.json.content | json_query('[?description==`Reboot a machine.`].id') | first }}"
  • 解释:[?description==Reboot a machine.].id这个JMESPath表达式会遍历content数组,找出所有description等于目标值的项,然后提取它们的id字段;| first是取第一个结果(正常情况下这个Action只会有一个,所以直接取第一个就行)。

解决方案二:用loop遍历匹配(适合复杂判断场景)

如果你需要更灵活的判断逻辑,比如多条件匹配,用loop遍历数组的方式更可控:

- name: 调用vRA API获取Actions列表
  uri:
    url: "你的vRA API地址"
    method: GET
    headers:
      Authorization: "Bearer {{ 你的认证Token }}"
    return_content: yes
  register: actions

- name: 遍历Actions列表找到Reboot对应的ID
  set_fact:
    reboot_action_id: "{{ item.id }}"
  loop: "{{ actions.json.content }}"
  when: item.description == "Reboot a machine."
  • 解释:直接遍历content里的每一项,当某一项的description匹配目标值时,就把它的id赋值给reboot_action_id。如果有多个匹配项,最后会保留最后一个匹配的结果,不过这个场景下应该只会有一个。

验证结果

你可以加个debug任务看看提取到的ID是否正确:

- name: 打印Reboot Action的ID
  debug:
    var: reboot_action_id

这样处理后,你就能拿到对应的ID,之后就可以在POST请求里使用这个变量了。

内容的提问来源于stack exchange,提问作者Ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:59:07