如何在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 中应该是什么样子?


评论:

  1. 最终结果实际上应该是 first_key="first_value", key_number_2="middle_value", last_key="three" 但我假设我应该解决上述问题,然后将其通过 join 过滤器。如果我错了请纠正我

  2. 这将成为 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