Ansible jinja2 - 如何格式化和压平笛卡尔积?

时间:2018-03-13 21:39:34

标签: ansible jinja2

想象一下,我有以下库存

[myservers]
127.0.0.1
192.168.0.6

在我的vars文件中,以下内容:

interesting_things:
  - name: alice
    port: 8080
  - name: bob
    port: 8181

如何产生以下结果?

127.0.0.1[8080],127.0.0.1[8181],192.168.0.6[8080],192.168.0.6[8181]

我试着买笛卡尔产品,但是没有出现:

debug: msg="{{ lookup('cartesian', groups['myservers'], interesting_things | map(attribute='port')) }}"

这给了我以下内容,但我无法弄清楚如何进一步。

{
    "msg": [
        [
            "127.0.0.1",
            8080
        ],
        [
            "127.0.0.1",
            8181
        ],
        [
            "192.168.0.6",
            8080
        ],
        [
            "192.168.0.6",
            8181
        ]
    ]
}

1 个答案:

答案 0 :(得分:1)

以你已有的为基础:

- name:
  set_fact:
    my_list: "{{ my_list|default([]) + [my_element] }}"
  vars:
    my_element: "{{ item[0] }}[{{ item[1] }}]"
  with_items:
    - "{{ lookup('cartesian', groups['myservers'], interesting_things | map(attribute='port')) }}"

- debug:
    msg: "{{ my_list|join(',') }}"

结果:

"msg": "127.0.0.1[8080],127.0.0.1[8181],192.168.0.6[8080],192.168.0.6[8181]"