我在模板中有非常简单的一行:
ip={{ip|join(', ')}}
Run Code Online (Sandbox Code Playgroud)
我有ip列表:
ip:
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
Run Code Online (Sandbox Code Playgroud)
但应用程序需要带引号的IP(ip ='1.1.1.1','2.2.2.2').
我可以这样做:
ip:
- "'1.1.1.1'"
- "'2.2.2.2'"
- "'3.3.3.3'"
Run Code Online (Sandbox Code Playgroud)
但它非常难看.是否有任何好的方法在ansible的列表的每个元素上添加引号?
谢谢!
Zas*_*asz 14
这将有效:
ip={{ '\"' + ip|join('\", \"') + '\"' }}
Run Code Online (Sandbox Code Playgroud)
自定义过滤器插件也可以使用.在ansible.cfg中取消注释filter_plugins并给它一个路径,我们把它放在哪里
def wrap(list):
return [ '"' + x + '"' for x in list]
class FilterModule(object):
def filters(self):
return {
'wrap': wrap
}
Run Code Online (Sandbox Code Playgroud)
在名为core.py的文件中.像这样.然后你可以简单地使用
ip|wrap|join(', ')
Run Code Online (Sandbox Code Playgroud)
它应该生成逗号分隔列表,每个ip都用引号括起来.
Kas*_*yap 12
尝试:
- hosts: localhost
tags: s20
gather_facts: no
vars:
ip:
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
joined_ip: "'{{ \"', '\".join(ip)}}'"
tasks:
- debug: msg="(ip={{joined_ip}})"
Run Code Online (Sandbox Code Playgroud)
PS:ansible支持一些python代码执行{{}},这是我在这里滥用的.
正如本博客中提到的:https://medium.com/opsops/how-enquote-list-elements-faab833e25fe
使用to_json过滤器。这将双引号列表中的每个字符串:
list_of_string | map("to_json")
Run Code Online (Sandbox Code Playgroud)
“quote”过滤器的问题在于它不会引用从 bash 角度不需要引用的元素(字符串中没有空格)。但对于 Windows 命令,有时无论如何都必须引用字符串。
以下对我有用
('{{ iplist | join('\',\'') }}')
Run Code Online (Sandbox Code Playgroud)
前任:
Inventory
[ips]
1.1.1.1
2.2.2.2
3.3.3.3
#cat temp.sh.j2
"ips": (ip='{{ groups['zoo'] | join('\',\'') }}')
result:
#cat temp.sh
"ips": (ip='1.1.1.1','2.2.2.2','3.3.3.3')
Run Code Online (Sandbox Code Playgroud)
希望它能帮助某人。
实际上有一个非常简单的方法来实现这个目的:
{{ mylist | map('quote') | join(', ') }}
Run Code Online (Sandbox Code Playgroud)
过滤器map遍历每个项目并进行quote处理.之后你可以轻松地将join它们放在一起.
| 归档时间: |
|
| 查看次数: |
15555 次 |
| 最近记录: |