如何在Ansible中从vRA API返回的字典获取指定ID值
Ansible 从vRA API返回结果中提取指定描述对应的Action ID
我看你现在的问题是要从vRA API返回的JSON里,找到描述为"Reboot a machine."对应的ID,原代码没达到预期,我帮你分析下问题,再给你两种可行的解决方案。
先说说原代码的问题
- 语法与逻辑错误:你用
with_sequence遍历索引的方式不仅不够直观,而且when条件里的写法有问题——Ansible在条件判断里不需要用{{ }}包裹变量,直接写表达式就行。另外register的用法完全错了,它是用来保存整个任务的执行结果的,不能直接把值写到actions.json.content里,应该用set_fact来定义新变量。 - 匹配关键词不对:你原代码里匹配的是"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
相关产品推荐
相关产品推荐

