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

如何用Ansible嵌套循环列表生成指定结构的字典集合

问题描述

现有如下Ansible变量:

result:
    results:
    - ansible_loop_var: item
      item: /bigdata/gidn/data/input/datalake/test_workspace_3
      stdout: |2-
 
        snapshot_input
      stdout_lines:
      - ''
      - snapshot_input
    - ansible_loop_var: item
      item: /bigdata/gidn/data/output/datalake/test_workspace_3
      stdout: |2-
 
        snapshot_output
      stdout_lines:
      - ''
      - snapshot_output
    - ansible_loop_var: item
      item: /bigdata/gidn/projets/datalake/test_workspace_3
      stdout: |2-
 
        snapshot_projet_1
        snapshot_projet_2
      stdout_lines:
      - ''
      - snapshot_projet_1
      - snapshot_projet_2

需要遍历result.results中的每个条目,并对每个条目的stdout_lines进行二次遍历,最终生成如下格式的字典集合:

{'path': '/bigdata/gidn/data/input/datalake/test_workspace_3', 'id':'snapshot_input'},
{'path': '/bigdata/gidn/data/output/datalake/test_workspace_3', 'id':'snapshot_output'},
{'path': '/bigdata/gidn/projets/datalake/test_workspace_3', 'id':'snapshot_projet_1'},
{'path': '/bigdata/gidn/projets/datalake/test_workspace_3', 'id':'snapshot_projet_2'}
解决方案

可以使用Ansible的set_fact模块结合嵌套循环实现需求,示例Playbook代码如下:

- name: 生成目标字典集合
  set_fact:
    target_list: "{{ target_list | default([]) + [{'path': outer_item.item, 'id': line}] }}"
  loop: "{{ outer_item.stdout_lines }}"
  loop_control:
    loop_var: line
  when: line != ''
  with_items: "{{ result.results }}"
  loop_control:
    loop_var: outer_item

代码说明

  1. 外层循环遍历result.results中的每个条目,用outer_item作为循环变量
  2. 内层循环遍历当前条目的stdout_lines,用line作为循环变量
  3. 通过when条件过滤掉空字符串条目
  4. 将符合条件的path(对应outer_item.item)和id(对应非空的line)组成字典,追加到target_list变量中

执行完成后,target_list变量即为所需的字典集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:02:45