将 ansible 列表列表转换为字典列表

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

我终于学会了如何使用

product
进行嵌套列表,但我不喜欢必须通过索引访问结果。
product
生成一个列表列表,我想要一个字典列表。

例如下面的代码....

- name: experimenting
  hosts: localhost
  tasks:
  - name: Define some facts
    set_fact:
      people:
      - name: "Fred"
      - name: "John"
      animals:
      - name: "cat"

  - debug:
      msg: "{{ animals | product(people)  }}"  

...产生以下输出:

ok: [localhost] => {
    "msg": [
        [
            {
                "name": "cat"
            },
            {
                "name": "Fred"
            }
        ],
        [
            {
                "name": "cat"
            },
            {
                "name": "John"
            }
        ]
    ]
}

我怎样才能把它变成这样:

ok: [localhost] => {
    "msg": [
        {
            animal: {
                name: "cat"
            },
            person: {
                name: "Fred"
            }
        },
        {
            animal: {
                name: "cat"
            },
            person: {
                name: "John"
            }
        }
    ]
}

在 C# 中,我会使用 LINQ

Select
语句,但我在 ansible 世界中找不到等效的语句。

ansible ansible-2.x ansible-facts
1个回答
-1
投票

Chat GPT 3.5 没有帮助,所以我支付了 4.0 升级费用。没过多久就得到了正确答案:

- name: experimenting
  hosts: localhost
  tasks:
  - name: Define some facts
    set_fact:
      people:
      - name: "Fred"
      - name: "John"
      animals:
      - name: "cat"

  - name: Transform the data
    set_fact:
      transformed: "{{ transformed | default([]) + [{'animal': item[0], 'person': item[1] }] }}"
    loop: "{{ animals | product(people) }}"

  - debug:
      msg: "{{ transformed }}"

...产生:

ok: [localhost] => {
    "msg": [
        {
            "animal": {
                "name": "cat"
            },
            "person": {
                "name": "Fred"
            }
        },
        {
            "animal": {
                "name": "cat"
            },
            "person": {
                "name": "John"
            }
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.