Ansible 创建字典并双循环一个包含列表的列表

问题描述 投票:0回答:1

我有这个变量

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
1个回答
1
投票

Ansible 不直接支持嵌套循环,但我们可以使用

subelements
过滤器之类的东西来伪造它,如下所示:

- hosts: localhost
  gather_facts: false
  vars:
    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/projects/datalake/test_workspace_3
          stdout: |2-
    
            snapshot_project_1
            snapshot_project_2
          stdout_lines:
          - ''
          - snapshot_project_1
          - snapshot_project_2

  tasks:
    - loop: "{{ result.results|subelements('stdout_lines')}}"
      when: item.1
      vars:
        myvar: []
      set_fact:
        myvar: "{{ myvar + [{'path': item.0.item, 'id': item.1}]}}"

    - debug:
        msg: "{{ myvar }}"

这将产生以下输出:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        {
            "id": "snapshot_input",
            "path": "/bigdata/gidn/data/input/datalake/test_workspace_3"
        },
        {
            "id": "snapshot_output",
            "path": "/bigdata/gidn/data/output/datalake/test_workspace_3"
        },
        {
            "id": "snapshot_project_1",
            "path": "/bigdata/gidn/projects/datalake/test_workspace_3"
        },
        {
            "id": "snapshot_project_2",
            "path": "/bigdata/gidn/projects/datalake/test_workspace_3"
        }
    ]
}

(注意:在你的问题中,你说,“我想创建一个像这样的字典......”,但你显示的示例是字典的列表,这就是我在这里生成的。)

© www.soinside.com 2019 - 2024. All rights reserved.