如何在Ansible循环中将subelements生成的item.1转为item?
解决Ansible中subelements循环的item.1转item及附件筛选问题
方法一:通过include_tasks传递变量重命名
直接在调用子任务时,将item.1(附件信息)赋值给子任务内使用的item变量,同时可按需保留页面信息:
主任务代码:
- name: 调用S3对象信息查询任务 include_tasks: get_s3_object_info.yml loop: "{{ var.json.results | subelements('children.attachment.results') }}" vars: item: "{{ item.1 }}" # 将附件信息重命名为子任务中的item page_info: "{{ item.0 }}" # 可选:保留页面信息,子任务中可通过page_info访问页面标题等
子任务get_s3_object_info.yml代码:
- name: 查询S3对象信息 amazon.aws.s3_object_info: region: "{{ region }}" bucket_name: "{{ bucket }}" object_name: "file/path/{{ item.title }}" register: s3_object_result # 后续可直接使用item.history访问附件的历史属性
方法二:预处理数据生成扁平的附件列表
通过json_query过滤器直接提取所有附件信息(可同时保留关联页面信息),生成独立的附件列表后循环:
- name: 提取所有附件及关联页面信息 set_fact: all_attachments: >- {{ var.json.results | json_query('[].{page_title: title, attachments: children.attachment.results}') | json_query('[].attachments[] | [].{page_title: @.^.page_title, title: title, history: history}') }} - name: 调用S3对象信息查询任务 include_tasks: get_s3_object_info.yml loop: "{{ all_attachments }}"
子任务中直接使用{{ item.title }}、{{ item.history }},若需要页面标题则用{{ item.page_title }}。
方法三:简化循环对象(丢失页面信息)
如果不需要页面信息,可通过map('last')过滤器直接提取subelements结果中的附件部分:
- name: 调用S3对象信息查询任务 include_tasks: get_s3_object_info.yml loop: "{{ var.json.results | subelements('children.attachment.results') | map('last') | list }}"
子任务中直接使用{{ item.title }}和{{ item.history }}即可。
附件类型筛选
如果你的Confluence API返回数据中包含附件类型标识(比如type: attachment字段),可通过json_query筛选出仅附件类型的项:
假设数据结构中每个子项带有type字段,筛选代码示例:
- name: 筛选仅附件类型的子项 set_fact: filtered_attachments: >- {{ var.json.results | json_query('[].children.*[?type==`attachment`].results[]') | flatten }}
若当前数据已明确是children.attachment下的结果,说明已经是附件类型,无需额外筛选。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

