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 %}
我有一个 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 %}