首页 > 解决方案 > 需要帮助将两个字典合并在一起

问题描述

我有这些变量:

vars:
  server:
    results:
       name: instance_titi
        type: lin
       name: instance_toto
        type: win
  password:
     stdout: Titi
      rc: 0
     stdout: Toto
      rc: 0

我想要一个变量包含:

[
  {
    "name": "instance_titi",
    "type": "lin",
    "stdout": "Titi",
    "rc": 0
  }
],
[ 
  {
    "name": "instance_toto",
    "type": "win",
    "stdout": "Toto",
    "rc": 0
  }
]

我确信我的索引会正确地相互对齐,我只需要将一个塞进另一个里面。

我使用 zip 有点接近:

- name: Add password for instances in server list
  set_fact:
     looped: "{{ server.results | zip(password) }}"

调试给了我:

"msg": [
    [
        {
            "name": "instance_titi",
            "type": "lin"
        },
        {
            "rc": 0,
            "stdout": "Titi"
        }
    ],
    [
        {
            "name": "instance_toto",
            "type": "win"
        },
        {
            "rc": 0,
            "stdout": "Toto"
        }
    ]
]

我在这里卡住了。

标签: ansible

解决方案


如果您想避免循环并在一行中需要它,您可以看看我写的内容:

- hosts: localhost
  vars:
    server:
      results:
       - name: instance_titi
         type: lin
       - name: instance_toto
         type: win
    password:
     - stdout: Titi
       rc: 0
     - stdout: Toto
       rc: 0
  tasks:
  - debug:
      msg: |
   {{ server.results
       | zip(password)
       | map('map','dict2items')
       | map('flatten')
       | map('list')
       | map('items2dict') | list
   }}

这正是您想要的:

ok: [localhost] =>
  msg:
  - name: instance_titi
    rc: 0
    stdout: Titi
    type: lin
  - name: instance_toto
    rc: 0
    stdout: Toto
    type: win

让我知道您是否需要解释我的所作所为。干杯!


推荐阅读