如何在ansible中定义格式化字符串列表?
How to define list of formated strings in ansible?
假设我有一个这样的字典列表
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
我想要一个格式化的字符串列表 {key}="{value}"
,所以预期的结果是
['first_key="first_value"', 'key_number_2="middle_value"', 'last_key="three"']
在 Python 中我会这样做 ['{key}="{value}"'.format(**i) for i in elements]
,但是在 jinja2 中没有列表理解。
这在 Ansible 中应该是什么样子?
评论:
最终结果实际上应该是 first_key="first_value", key_number_2="middle_value", last_key="three"
但我假设我应该解决上述问题,然后将其通过 join
过滤器。如果我错了请纠正我
这将成为 Ansible 模板的一部分。
如果您需要一个带有值的变量,您可以简单地使用 loop
,然后是 join
过滤器:
- hosts: all
gather_facts: no
tasks:
- set_fact:
list: "{{ list | default([]) + [item.key ~ '=\"' ~ item.value ~ '\"'] }}"
loop: "{{ elements }}"
vars:
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
- debug:
msg: "{{ list | join(', ') }}"
将产生重述:
PLAY [all] *******************************************************************************************************
TASK [set_fact] **************************************************************************************************
ok: [localhost] => (item={'key': 'first_key', 'value': 'first_value'})
ok: [localhost] => (item={'key': 'key_number_2', 'value': 'middle_value'})
ok: [localhost] => (item={'key': 'last_key', 'value': 'three'})
TASK [debug] *****************************************************************************************************
ok: [localhost] =>
msg: first_key="first_value", key_number_2="middle_value", last_key="three"
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
现在,如果您在 Jinja 模板中需要它,您可以使用普通的 Jinja for
以及用于逗号的 loop.last
变量:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: >-
{% for element in elements -%}
{{ element.key }}="{{ element.value }}"
{%- if not loop.last %}, {% endif %}
{%- endfor %}
vars:
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
将产生回顾:
PLAY [all] *******************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] =>
msg: first_key="first_value", key_number_2="middle_value", last_key="three"
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
假设我有一个这样的字典列表
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
我想要一个格式化的字符串列表 {key}="{value}"
,所以预期的结果是
['first_key="first_value"', 'key_number_2="middle_value"', 'last_key="three"']
在 Python 中我会这样做 ['{key}="{value}"'.format(**i) for i in elements]
,但是在 jinja2 中没有列表理解。
这在 Ansible 中应该是什么样子?
评论:
最终结果实际上应该是
first_key="first_value", key_number_2="middle_value", last_key="three"
但我假设我应该解决上述问题,然后将其通过join
过滤器。如果我错了请纠正我这将成为 Ansible 模板的一部分。
如果您需要一个带有值的变量,您可以简单地使用 loop
,然后是 join
过滤器:
- hosts: all
gather_facts: no
tasks:
- set_fact:
list: "{{ list | default([]) + [item.key ~ '=\"' ~ item.value ~ '\"'] }}"
loop: "{{ elements }}"
vars:
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
- debug:
msg: "{{ list | join(', ') }}"
将产生重述:
PLAY [all] *******************************************************************************************************
TASK [set_fact] **************************************************************************************************
ok: [localhost] => (item={'key': 'first_key', 'value': 'first_value'})
ok: [localhost] => (item={'key': 'key_number_2', 'value': 'middle_value'})
ok: [localhost] => (item={'key': 'last_key', 'value': 'three'})
TASK [debug] *****************************************************************************************************
ok: [localhost] =>
msg: first_key="first_value", key_number_2="middle_value", last_key="three"
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
现在,如果您在 Jinja 模板中需要它,您可以使用普通的 Jinja for
以及用于逗号的 loop.last
变量:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: >-
{% for element in elements -%}
{{ element.key }}="{{ element.value }}"
{%- if not loop.last %}, {% endif %}
{%- endfor %}
vars:
elements:
- key: first_key
value: first_value
- key: key_number_2
value: middle_value
- key: last_key
value: three
将产生回顾:
PLAY [all] *******************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] =>
msg: first_key="first_value", key_number_2="middle_value", last_key="three"
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0