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

如何编写Ansible循环代码合并多页API结果为数组?

处理Ansible中API分页返回的批量数据,构建完整数组

针对API单次最多返回100条、总数据超500条的场景,手动枚举source_list.results[x]的方式无法适配未知数量的分页结果。以下是自动遍历所有分页、合并数据的解决方案:

步骤1:初始化分页相关变量

先定义用于存储全量API结果和控制分页的变量:

- name: Initialize pagination variables
  set_fact:
    full_api_results: []
    current_page: 1  # 若API采用offset分页,可改为0

步骤2:循环调用API获取所有分页

使用uri模块结合until循环,持续请求API直到没有更多数据返回:

- name: Fetch all pages from target API
  uri:
    url: "https://your-api-endpoint?page={{ current_page }}&limit=100"  # 替换为实际API地址及分页参数
    method: GET
    return_content: yes
    # 若API需要认证,添加对应参数示例:
    # headers:
    #   Authorization: "Bearer {{ api_auth_token }}"
  register: api_response
  until: api_response.json.SearchResult.resources | length < 100  # 返回结果不足100条时判定为最后一页
  retries: 6  # 覆盖500条数据的最大页数(5页),留1次冗余重试
  delay: 2  # 请求间隔2秒,避免触发API限流
  set_fact:
    full_api_results: "{{ full_api_results + [api_response.json.SearchResult] }}"
    current_page: "{{ current_page | int + 1 }}"

步骤3:合并所有分页数据到list_a

将全部分页返回的resources数据合并为最终的list_a,有两种实现方式:

方式1:通过循环拼接

- name: Build complete list_a with loop
  set_fact:
    list_a: "{{ list_a + item.resources }}"
  loop: "{{ full_api_results }}"
  vars:
    list_a: []

方式2:用过滤器简洁实现

借助Ansible的map和flatten过滤器,一步完成合并:

- name: Build complete list_a with filters
  set_fact:
    list_a: "{{ full_api_results | map(attribute='resources') | flatten }}"

关键注意事项

  • 请根据实际API的分页规则调整until条件:部分API会返回has_more布尔字段,此时可将条件改为api_response.json.has_more == false。
  • 若API有调用频率限制,可适当调大delay参数的值。
  • 确保retries次数足够覆盖所有可能的分页数量,避免提前终止循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:10:51