【问题标题】:How to define list of formated strings in ansible?如何在ansible中定义格式化字符串列表?
【发布时间】:2021-04-08 19:22:54
【问题描述】:

假设我有一个这样的字典列表

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


cmets:

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

  2. 这将成为 Ansible 模板的一部分。

【问题讨论】:

  • 列表推导只是一种更短、更 Pythonic 的循环方式。因此,如果这应该在模板中,只需执行 for

标签: ansible jinja2 ansible-template


【解决方案1】:

如果您需要一个带有值的变量,您可以简单地使用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   

【讨论】:

  • 是的,我做了类似的事情(在循环中连接),但你的代码看起来比我的更干净:)。恕我直言,像列表理解这样的声明性更好,正在寻找一些疯狂的过滤器或其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多