Jinja2:格式+加入列表项

时间:2016-02-03 17:28:38

标签: python jinja2 ansible

play_hosts是播放所有机器的列表。我想采用这些并使用format()之类的内容来重写它们,如rabbitmq@%s,然后将它们与join()之类的内容结合起来。所以:

{{ play_hosts|format(???)|join(', ') }}

所有格式示例都使用管道,其中输入是格式字符串而不是列表。有没有办法使用这些(或其他东西)来实现我想要的东西?输出应该类似于:

['rabbitmq@server1', 'rabbitmq@server2', rabbitmq@server3', ...]

jinja2 doc描述了这样的格式:

format(value, *args, **kwargs)

在对象上应用python字符串格式:

{{ "%s - %s"|format("Hello?", "Foo!") }}
-> Hello? - Foo!

因此它给出了三种输入,但没有描述示例中的那些输入,它们在管道中显示一个,另外两个通过args传入。是否有关键字arg来指定管道输入的字符串?请帮忙,蟒蛇僧侣!

4 个答案:

答案 0 :(得分:15)

在ansible中,您可以使用regex_replace过滤器:

{{ play_hosts | map('regex_replace', '^(.*)$', 'rabbitmq@\\1') | list}

答案 1 :(得分:7)

您可以创建自定义过滤器

{{ play_hosts | format_list('rabbitmq@%s') }}

并使用它

{{1}}

答案 2 :(得分:6)

您不仅可以# debug tools %w{tshark}.each do |pkg| package pkg do action :install end end join,还可以添加前缀。现在,这不是非常pythonic或复杂,但一个非常简单的工作解决方案:

,

答案 3 :(得分:5)

我认为另一种方法是使用joiner全局函数,因为您可以阅读http://jinja.pocoo.org/docs/2.9/templates/#list-of-global-functions

  

一个joiner传递一个字符串,并且每次调用时都会返回该字符串,除了第一次(在这种情况下它返回一个空字符串)。你可以用它来加入东西

所以你的代码应该是这样的:

[
{% set comma = joiner(",") %}    
{% for host in play_hosts %}
    {{ comma() }}
    {{ "rabbitmq@%s"|format(host) }}
{% endfor %}
]