我在ansible中有以下代码:
---
- name: "Retrieve ID for group {{onboarding.repo.subGroup}}"
uri:
method: GET
return_content: yes
validate_certs: "{{gitlab_validate_certs}}"
url: "{{ gitlab_api_url }}/api/v4/groups?search={{onboarding.repo.subGroup}}"
headers:
Private-Token: "{{ gitlab_api_token }}"
register: uri_response
- debug:
msg: "{{ uri_response['content'] }}"
- set_fact:
groupID: "{{ uri_response['content'] | from_json | json_query([*].[?name=='{{onboarding.repo.subGroup}}'].id) }}"
get 方法检索如下所示的 json 列表:
[
{
"id":1,
"name":"name1"
},
{
"id":2,
"name":"name2"
},
...
]
使用 set_fact 模块,我试图获取与特定名称相对应的项目的 id。我尝试了很多json_query语法(例如
.[?name=='{{onboarding.repo.subGroup}}'].id
或[?name=='{{onboarding.repo.subGroup}}'].id)
,但没有成功。我在网上看到了很多不同的例子,但它们是不同的,因为列表是一个键的值,如下所示:
key:
[
{...},
{...},
...
]
我看到了使用查询语法的不同示例,例如
key.[?name=='{{onboarding.repo.subGroup}}'].id
我找不到一种方法来使该查询适应我的情况。谁能帮我找到正确的语法?
问候, 乔治
问:“获取与特定名称对应的项目的 id。”
A:将列表转换为字典
content: "{{ uri_response.content |
items2dict(key_name='name', value_name='id') }}"
给予
content:
name1: 1
name2: 2
使用字典
- debug:
msg: "{{ content[item] | default('undef') }}"
loop:
- name1
- name2
- name3
给出(删节)
msg: '1'
msg: '2'
msg: undef
完整剧本示例
- hosts: localhost
vars:
uri_response:
content:
[
{
"id":1,
"name":"name1"
},
{
"id":2,
"name":"name2"
}
]
content: "{{ uri_response.content |
items2dict(key_name='name', value_name='id') }}"
tasks:
- debug:
msg: "{{ content[item]|default('undef') }}"
loop:
- name1
- name2
- name3