Ansible合并两个数组

4
我将用Ansible合并以下两个数组:
```yaml ```
TASK [Show var1] ****************************************************************************
ok: [localhost] => {
    "var1": [
        {
            "id": "133"
        },
        {
            "id": "149"
        },
        {
            "id": "188"
        }
    ]
}

并且

TASK [Show var2] ****************************************************************************
ok: [localhost] => {
    "var2": [
        {
            "name": "two"
        },
        {
            "name": "one"
        },
        {
            "name": "three"
        }
    ]
}

结果应该是:
    "var1": [
        {
            "id": "133",
            "name": "two"
        },
        {
            "id": "149",
            "name": "one"
        },
        {
            "id": "188",
            "name": "three"
        }
    ]

到目前为止,我尝试合并数组的努力只返回了最后一对。我该如何获得整个数组的合并呢?

1个回答

4
这里有一个可能的解决方案;我们使用set_factcombine过滤器,循环遍历var1|zip(var2)
- hosts: localhost
  gather_facts: false
  vars:
    var1:
      - id: 133
      - id: 149
      - id: 188
    var2:
      - name: two
      - name: one
      - name: three

  tasks:
    - set_fact:
        var3: "{{ var3 + [item[0]|combine(item[1])] }}"
      vars:
        var3: []
      loop: "{{ var1|zip(var2)|list }}"

    - debug:
        msg: "{{ var3 }}"

(查看文档以获取与set_factcombine相关的信息)。

这将输出:


PLAY [localhost] *****************************************************************************************************************************************************************************

TASK [set_fact] ******************************************************************************************************************************************************************************
ok: [localhost] => (item=[{'id': 133}, {'name': 'two'}])
ok: [localhost] => (item=[{'id': 149}, {'name': 'one'}])
ok: [localhost] => (item=[{'id': 188}, {'name': 'three'}])

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "id": 133,
            "name": "two"
        },
        {
            "id": 149,
            "name": "one"
        },
        {
            "id": 188,
            "name": "three"
        }
    ]
}

PLAY RECAP ***********************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


谢谢!顺便问一下,这个能实时生成吗?例如,var2是按以下方式生成的: set_fact: var2: "{{ var2|default([]) + [ {'name': item.matches[0].value} ] }}" with_items: "{{ output.results }}" 那么var3能在这里生成吗? - SteveM
我不确定你具体在建议什么,但 Ansible 并不关心变量是静态定义的还是使用 set_fact 在运行时创建的。最好开一个新问题,这样你就可以展示你正在处理的代码了。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接