Ansible yml更改引号

时间:2018-03-20 16:05:50

标签: ansible yaml jinja2

使用Ansible,在我的角色中,我定义了一个变量(defaults/main.yml):

someHosts: "[ \"{{ hosts| join(':' + port + '\", \"') }}:{{ port }}\" ]"
基本上给出hosts=["host1", "host2"]port=5050

意味着将上述内容转换为:

["host1:5050", "host2:5050"]

不,我在带有*.j2模块的jinja2模板文件(template)中使用它。我的模板文件包含以下行:

  hosts => {{ someHosts }}

但现在运行后我在实际机器上看到以下内容(less):

['host1:5050', 'host2:5050']

为什么在地球上它是如何将双引号改为单引号?

EDIT / ANSWER

基于@ techraf的答案,这就是我提出的:

someHosts: "{{ hosts | zip_longest([], fillvalue=':' + port) | map('join') | list | to_json }}"

2 个答案:

答案 0 :(得分:3)

  

为什么在地球上它是如何将双引号改为单引号?

因为您创建的列表对象不是字符串;这就是Jinja2呈现字符串列表的方式。

通过添加:

自行查看
- debug:
    var: someHosts|type_debug

你得到:

ok: [localhost] => {
    "someHosts|type_debug": "list"
}

但是,如果您的问题是如何以JSON格式获取该列表,那么您的模板应为:

hosts => {{ someHosts | to_json }}

答案 1 :(得分:1)

如果使用模板:

[{% for host in groups['mygroup']%}
    "{{ host }}:{{port}}"{% if not loop.last %},{% endif %}
 {% endfor %}]

您所要做的就是与您的小组定义或替换我的小组。