我在 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(',') }}