Ansible Jinja循环场景下如何去除字符串末尾的逗号?
解决Ansible模板生成Zookeeper地址列表末尾多余逗号的问题
嘿,这个场景我配置ZK集群的时候也踩过坑!你的问题核心是Jinja2循环里每个元素都加了逗号,包括最后一个,导致输出末尾多了个多余的逗号。这里有两种简单好用的解决办法:
方法1:用Jinja2的join过滤器(最简洁)
直接把所有需要的地址生成一个列表,再用逗号拼接,完全不用担心末尾的逗号问题。修改后的模板代码如下:
{% if hostvars[inventory_hostname].local_zk_server_id is defined %} zookeeperServers={{ groups[target_hosts] | map('extract', hostvars, 'inventory_hostname') | map('regex_replace', '^(.*)$', '\\1:2181') | map('quote') | join(',') }} {% endif %}
解释一下这个逻辑:
map('extract', hostvars, 'inventory_hostname'):从hostvars中提取每个目标主机的主机名map('regex_replace', '^(.*)$', '\\1:2181'):给每个主机名加上:2181端口map('quote'):给每个地址加上双引号join(','):用逗号把所有地址拼接起来,自动处理分隔符,不会有多余逗号
方法2:利用循环变量loop.last判断
如果更习惯用显式的循环写法,可以在循环里判断当前是不是最后一个元素,只有不是最后一个的时候才输出逗号:
{% if hostvars[inventory_hostname].local_zk_server_id is defined %} zookeeperServers={% for host in groups[target_hosts] %} "{{ hostvars[host].inventory_hostname }}:2181"{% if not loop.last %},{% endif %} {% endfor %} {% endif %}
这里的loop.last是Jinja2内置的循环变量,当循环到最后一个主机时,它的值为true,这时候我们就不输出逗号,完美解决末尾多余的问题。
内容的提问来源于stack exchange,提问作者Gee.Fu
相关产品推荐
相关产品推荐

