我有一个看起来像这样的 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
或者尝试一些内联 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
这也应该在模板文件中工作:
result={% for item in servers %}{{item.name}}-{{item.port}}{{ '' if loop.last else ',' }}{% endfor %}
关于ansible - jinja/ansible 模板中的复杂字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698232/