在 Ansible 模板中加入键值对列表

bad*_*hop 2 jinja2 ansible ansible-template ansible-2.x

我需要将以下 yaml 字典转换为逗号分隔的 key=value 对列表

nodes:
  node1: 192.168.56.11
  node2: 192.168.56.12
Run Code Online (Sandbox Code Playgroud)

所以它变成了

node1=192.168.56.11,node2=192.168.56.12
Run Code Online (Sandbox Code Playgroud)

在 Python 中,我会使用简单的列表理解来完成此操作,然后加入列表:

','.join([ k+'='+v for k,v in nodes.items()])
Run Code Online (Sandbox Code Playgroud)

不过,我不知道如何在 Ansible 模板中优雅地做到这一点。for当然,我可以用循环来做到这一点,但它会留下尾随逗号。迄今为止我最好的镜头:

{% for k,v in nodes.items() %}{{k}}={{v}}{% if not loop.last %},{% endif %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我是否忽略了什么?

ili*_*-sp 5

Ansible 的等价物是下面的items()和 连接链接。如果您希望它们按键排序,我添加了第二种方法:

---
- hosts: localhost
  gather_facts: false
  vars:
    nodes:
      node3: 192.168.56.13
      node1: 192.168.56.11
      node4: 192.168.56.14
      node2: 192.168.56.12

  tasks:
  - name: print var
    debug:
      var: nodes.items()|map('join', '=')|join(',')

  - name: print var (items sorted)
    debug:
      var: nodes|dictsort|map('join', '=')|join(',')
Run Code Online (Sandbox Code Playgroud)

或者,在模板中:

{{nodes.items()|map("join", "=")|join(",")}}
Run Code Online (Sandbox Code Playgroud)