如何在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
相关产品推荐
相关产品推荐

