Ansible:从 json 文件中的对象列表中过滤项目

问题描述 投票:0回答:1

我在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

我找不到一种方法来使该查询适应我的情况。谁能帮我找到正确的语法?

问候, 乔治

json ansible set json-query fact
1个回答
2
投票

问:“获取与特定名称对应的项目的 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
© www.soinside.com 2019 - 2024. All rights reserved.