如何从 jinja 模板中删除多个以空格分隔的字符串中的尾随空格?

问题描述 投票:0回答:1

出于某种原因,我真的很挣扎,无法弄清楚这一点。我尝试了多种变体但没有运气。基本上,我通过 Jinja2 模板和 Ansible 将多个 LDAP 端点注入到我的 nslcd.conf 中,但是无论我做什么,我都会留下一个尾随空格。在某些节点上,它导致 nslcd 服务无法加载,因此我尝试删除空格,但运气不佳。有什么建议么?这是基本代码 -

uri = {% for host in ldap_hosts %}{{ ldap_protocol }}://{{ host }} {% endfor %}

base {{ ldap_base_dn }}
binddn {{ ldap_bind_dn }}
bindpw {{ ldap_bind_password }}
rootpwmoddn {{ ldap_bind_dn }}

输出-

uri = ldaps://ldaps.fake.domain.net ldaps://ldaps.alsofake.domain.net
base DC=something,DC=local
binddn CN=ldap_bind_user,OU=ServiceAccounts,OU=Groups,OU=Accounts,DC=something,DC=local
bindpw yoink
rootpwmoddn CN=ldap_bind_user,OU=ServiceAccounts,OU=Groups,OU=Accounts,DC=something,DC=local

我想要得到的是-

uri = ldaps://ldaps.fake.domain.net ldaps://ldaps.alsofake.domain.net

不是

uri = ldaps://ldaps.fake.domain.net ldaps://ldaps.alsofake.domain.net 

我已经尝试了所有我能想到的

uri = {% for host in ldap_hosts %}{{ ldap_protocol }}://{{ host }} {% endfor %}
组合。

{%- for host in ldap_hosts %} ... {%+ endfor -%}
- 完全删除新行并将基础放在 uri 行上

{%+ for host in ldap_hosts -%} ... {%+ endfor %}
- 看起来正常但尾随空白仍然存在

{% for host in ldap_hosts %} ... {%- endfor -%}
- 删除换行符并将基数放在 uri 行上

{%+ for host in ldap_hosts -%} ... {%+ endfor -%}
- 删除换行符并将基数放在 uri 行上

{%+ for host in ldap_hosts -%} ... ://{{ host }}{% endfor %}
- 将两个端点粉碎在一起

基本上,我尝试的任何选项要么删除换行符并将基数放在 uri 行上,要么使其看起来正常,但我在末尾发现了一个空格。是的,我知道这里有一个空格 -

://{{ host }} {%
,但那是为了分隔线路上的端点,以便在一个端点没有响应时有后备选项。这多年来一直运行良好,直到本周,当设备最终说出“这个空白是什么”并导致服务失败时。

更新:

uri = {% for host in ldap_hosts %}{{ ldap_protocol }}://{{ host }}{% if not loop.last %} {% endif %}{% endfor %}
成功了!谢谢乔恩SG

python ansible jinja2 trailing-whitespace
1个回答
0
投票

减号和加号控制空格和换行符。因此,只需将空格移至行首并使用

{%- for ... %}
即可消除处理换行符的需要,只需从循环开头删除前导空格即可:

uri =  {%- for host in ldap_hosts %}{{ ldap_protocol }}://{{ host }}{% endfor %}

base {{ ldap_base_dn }}
binddn {{ ldap_bind_dn }}
bindpw {{ ldap_bind_password }}
rootpwmoddn {{ ldap_bind_dn }}

或者,您可以省略循环并使用

map
join
和一些正则表达式准备整行,以将协议前缀添加到列表的每个元素(您也可以顺便将准备工作移出模板) - 降低复杂性或重用该值):

uri = {{ ldap_hosts | map('regex_replace', '^(\\w)', ldap_protocol + '://\\1' | join(' ') }}

base {{ ldap_base_dn }}
binddn {{ ldap_bind_dn }}
bindpw {{ ldap_bind_password }}
rootpwmoddn {{ ldap_bind_dn }}

但是,我更喜欢第一种方法,因为它看起来更干净(如果不修剪前导空格,甚至可能不会导致语法错误)。

© www.soinside.com 2019 - 2024. All rights reserved.