jinja/ansible模板中的复杂字符串连接

ten*_*npn 7 template-engine jinja2 ansible

我有一个看起来像这样的ansible dict:

servers:
  - name: foo
    port: 1000
  - name: bar
    port: 2000
Run Code Online (Sandbox Code Playgroud)

我想要一个ansible/jinja2模板来输出这个:

result=pre-foo-1000,pre-bar-1000
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有类似的东西:

result={{ servers | json_query('[*].name') | join(',') }}
Run Code Online (Sandbox Code Playgroud)

但那只输出:

result=foo,bar
Run Code Online (Sandbox Code Playgroud)

我尝试了一些json_query('[*].name-[*].port')没有成功的事情- 它给出了关于无效-文字的错误.我在json_query上找不到很多文档,但是我能在那里做更多的事情吗?或者更好的选择滑入过滤器?

Szt*_*upY 7

你可以先做一个普通循环,然后收集结果:

- hosts: all
  connection: local
  vars:
    servers:
      - name: foo
        port: 1000
      - name: bar
        port: 2000
  tasks:
    - set_fact:
        result_item: '{{ item.name }}-{{ item.port }}'
      with_items:
        - '{{ servers }}'
      register: result_list

    - set_fact:
        result: '{{ result_list.results | map(attribute="ansible_facts.result_item") | join(",") }}'

    - debug:
        var: result
Run Code Online (Sandbox Code Playgroud)

或者尝试一些内联jinja循环:

- hosts: all
  connection: local
  vars:
    servers:
      - name: foo
        port: 1000
      - name: bar
        port: 2000
  tasks:
    - set_fact:
        result: "{% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}"

    - debug:
        var: result
Run Code Online (Sandbox Code Playgroud)

这也应该在模板文件中起作用:

result={% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}
Run Code Online (Sandbox Code Playgroud)