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

如何在Ansible Playbook中检测API返回JSON的ID并注册变量

Ansible Playbook实现API资源的存在性检查与增改操作

需求:调用API获取JSON数据,检查指定ID(如output-1)是否存在。若存在则通过PUT请求更新配置,若不存在则通过POST请求创建配置。以下是实现ID存在性检测并完成后续逻辑的完整方案:

核心解决方案:检测目标ID并注册变量

可以通过两种方式实现ID存在性判断,将结果注册为id_exists布尔变量:

方法1:使用json_query(依赖jmespath)

利用json_query提取所有ID形成列表,再通过in操作符判断目标ID是否存在:

- name: "Check if target ID exists"
  ansible.builtin.set_fact:
    id_exists: "{{ 'output-1' in (result.json | json_query('items[*].id')) }}"

方法2:原生列表筛选(无需额外依赖)

如果环境未安装jmespath,可使用Ansible原生的selectattr筛选:

- name: "Check if target ID exists"
  ansible.builtin.set_fact:
    id_exists: "{{ result.json.items | selectattr('id', 'equalto', 'output-1') | list | length > 0 }}"

完整修正后的Playbook

注意:原Playbook中Create new config任务缺少ansible.builtin.uri模块声明,已修正:

- name: "Call API to get JSON data"
  ansible.builtin.uri:
    url: https://example.com/api/outputs
    method: get
  register: result

- name: "Debug: Print all IDs"
  ansible.builtin.debug:
    msg: "{{ result.json | json_query(jmesquery) }}"
  vars:
    jmesquery: "items[*].{ID: id}"

# 检测目标ID是否存在(二选一即可)
- name: "Check if target ID exists"
  ansible.builtin.set_fact:
    id_exists: "{{ 'output-1' in (result.json | json_query('items[*].id')) }}"

- name: "Create new config"
  ansible.builtin.uri:
    url: https://example.com/api/outputs
    method: post
    headers:
      Content-Type: application/json
      Authorization: "ApiKey {{ api_key }}"
    body_format: json
    body: |
      {
         "id": "output-1",
         "name": "Name",
         "is_default": false,
         "type": "testtype",
         "config_yaml": "verification_mode: advanced"
      }
  when: not id_exists

- name: "Update existing config"
  ansible.builtin.uri:
    url: https://example.com/api/outputs/output-1
    method: put
    headers:
      Content-Type: application/json
      Authorization: "ApiKey {{ api_key }}"
    body_format: json
    body: |
      {
         "name": "New Name",
         "is_default": false,
         "type": "testtype",
         "config_yaml": "verification_mode: advanced"
      }
  when: id_exists

参考JSON返回示例

{
  "items": [
    {
      "id": "output-1",
      "name": "Output 1",
      "is_default": true,
      "type": "testtype",
      "config_yaml": "verification_mode: basic"
    },
    {
        "id": "output-2",
        "name": "Output 2",
        "is_default": false,
        "type": "testtype",
        "config_yaml": "verification_mode: basic"
      },
    {
      "id": "output-3",
      "name": "Output 3",
      "is_default": false,
      "type": "testtype",
      "config_yaml": "verification_mode: basic"
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:15:48