Ansible:删除嵌套循环中的最后一个逗号?



我在 jinja2 模板中有以下内容。本质上,我正在遍历字典,挑选名称,如果它不是以"sh"开头,我会将其添加到此配置中。但是,我想将服务器逗号分开。

servers = {% for item in list_search_peers.json['entry'] %}{% if not item.name.startswith('sh-') %}{{ item.name }}{% endif %}{% endfor %}

通常我会做这样的事情:

servers = {% for item in list_search_peers.json['entry'] %}{% if not item.name.startswith('sh-') %}{{ item.name }}{% if not loop.last %},{% endif %}{% endif %}{% endfor %}`

但是loop.last不起作用,因为我正在过滤掉其中一个值。

我的输出是:

servers = x.x.x.x:8089,y.y.y.y:8089,

但我想要没有最后一个,

servers = x.x.x.x:8089,y.y.y.y:8089

我试图{% set }设置一个变量,但在那里没有运气。

首先过滤列表。例如

my_list: "{{ list_search_peers.json.entry|
rejectattr('name', 'match', '^sh-(.*)$')|
list }}"

然后在模板中使用它

servers = {% for item in my_list %}{{ item.name }}{% if not loop.last %},{% endif %}{% endfor %}

更新

创建服务器列表

servers: "{{ list_search_peers.json.entry|
map(attribute='name')|
reject('match', 'sh-') }}"

例如,给定用于测试的数据

list_search_peers:
json:
entry:
- name: x.x.x.x:8089
- name: y.y.y.y:8089
- name: sh-dummy

servers:
- x.x.x.x:8089
- y.y.y.y:8089

然后,只需加入模板中的项目

servers = {{ servers|join(',') }}

servers = x.x.x.x:8089,y.y.y.y:8089

用于测试的完整行动手册示例

- hosts: localhost
vars:
list_search_peers:
json:
entry:
- name: x.x.x.x:8089
- name: y.y.y.y:8089
- name: sh-dummy
my_list: "{{ list_search_peers.json.entry|
rejectattr('name', 'match', 'sh-') }}"
servers: "{{ list_search_peers.json.entry|
map(attribute='name')|
reject('match', 'sh-') }}"
tasks:
- debug:
msg: |
{% for item in list_search_peers.json['entry'] %}
{% if not item.name.startswith('sh-') %}
{{ item.name }}{% if not loop.last %},{% endif %}
{%- endif %}
{%- endfor %}
- debug:
msg: |
{% for item in my_list %}
{{ item.name }}{% if not loop.last %},{% endif %}
{%- endfor %}
- debug:
var: servers
- debug:
msg: |
servers = {{ servers|join(',') }}

最新更新