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来指定管道输入的字符串?请帮忙,蟒蛇僧侣!
答案 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 %}
]