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

Complex string concatenation in jinja/ansible template

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

servers:
  - name: foo
    port: 1000
  - name: bar
    port: 2000

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

result=pre-foo-1000,pre-bar-1000

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

result={{ servers | json_query('[*].name') | join(',') }}

但这只会输出:

result=foo,bar

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

你可以先做一个简单的循环,然后收集结果:

- 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

或者尝试一些内联神社循环:

- 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

这也适用于模板文件:

result={% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}