在jinja2(ansible)中为列表中的elemens添加引号

Geo*_*lin 12 jinja2 ansible

我在模板中有非常简单的一行:

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都用引号括起来.

  • 不应该是`ip = {{'\"'+ ip | join('\",\"')+'\"'}}`? (2认同)

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代码执行{{}},这是我在这里滥用的.


nin*_*bre 9

正如本博客中提到的: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 命令,有时无论如何都必须引用字符串。

  • 似乎`to_json`已更改为`tojson` (3认同)

f-s*_*ety 6

以下对我有用

('{{ 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)

希望它能帮助某人。


Max*_*Max 5

实际上有一个非常简单的方法来实现这个目的:

{{ mylist | map('quote') | join(', ') }}
Run Code Online (Sandbox Code Playgroud)

过滤器map遍历每个项目并进行quote处理.之后你可以轻松地将join它们放在一起.

  • 出于某种原因,map('quote')在ansible中对我来说永远不会有效,它什么都不做 (5认同)
  • Ansible 的 `map('quote')` 仅适用于 shell (4认同)
  • “ quote”过滤器似乎是ansible的一部分,而不是jinja2的核心。 (3认同)
  • map('quote') 对 shell 变量进行引号(不适用于 j2 模板),并决定是否需要引用(基于字符串的内容)。要点:改用 for 循环。 (2认同)