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

