Ansible 模板将 'u' 添加到模板中的数组
Ansible template adds 'u' to array in template
我的 ansible 剧本中有以下 vars
我得到了以下结构
domains:
- { main: 'local1.com', sans: ['test.local1.com', 'test2.local.com'] }
- { main: 'local3.com' }
- { main: 'local4.com' }
并且在我的 conf.j2
中有以下内容
{% for domain in domains %}
[[acme.domains]]
{% for key, value in domain.iteritems() %}
{% if value is string %}
{{ key }} = "{{ value }}"
{% else %}
{{ key }} = {{ value }}
{% endif %}
{% endfor %}
{% endfor %}
现在,当我进入 VM 并查看文件时,我得到以下信息:
输出
[[acme.domains]]
main = "local1.com
sans = [u'test.local1.com', u'test2.local.com']
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
注意 sans
数组中的 u。
预期输出
[[acme.domains]]
main = "local1.com"
sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
为什么会发生这种情况,我该如何解决?
你得到 u' '
因为你打印包含 Unicode 字符串的对象,这就是 Python 默认呈现它的方式。
您可以使用 list | join
个过滤器对其进行过滤:
{% for domain in domains %}
[[acme.domains]]
{% for key, value in domain.iteritems() %}
{% if value is string %}
{{ key }} = "{{ value }}"
{% else %}
{{ key }} = ["{{ value | list | join ('\',\'') }}"]
{% endif %}
{% endfor %}
{% endfor %}
或者你可以相信 sans =
之后的字符串输出是 JSON 并使用 to_json
过滤器渲染它:
{{ key }} = {{ value | to_json }}
两者都会得到你:
[[acme.domains]]
main = "local1.com"
sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
但第一个更通用
我的 ansible 剧本中有以下 vars
我得到了以下结构
domains:
- { main: 'local1.com', sans: ['test.local1.com', 'test2.local.com'] }
- { main: 'local3.com' }
- { main: 'local4.com' }
并且在我的 conf.j2
{% for domain in domains %}
[[acme.domains]]
{% for key, value in domain.iteritems() %}
{% if value is string %}
{{ key }} = "{{ value }}"
{% else %}
{{ key }} = {{ value }}
{% endif %}
{% endfor %}
{% endfor %}
现在,当我进入 VM 并查看文件时,我得到以下信息:
输出
[[acme.domains]]
main = "local1.com
sans = [u'test.local1.com', u'test2.local.com']
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
注意 sans
数组中的 u。
预期输出
[[acme.domains]]
main = "local1.com"
sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
为什么会发生这种情况,我该如何解决?
你得到 u' '
因为你打印包含 Unicode 字符串的对象,这就是 Python 默认呈现它的方式。
您可以使用 list | join
个过滤器对其进行过滤:
{% for domain in domains %}
[[acme.domains]]
{% for key, value in domain.iteritems() %}
{% if value is string %}
{{ key }} = "{{ value }}"
{% else %}
{{ key }} = ["{{ value | list | join ('\',\'') }}"]
{% endif %}
{% endfor %}
{% endfor %}
或者你可以相信 sans =
之后的字符串输出是 JSON 并使用 to_json
过滤器渲染它:
{{ key }} = {{ value | to_json }}
两者都会得到你:
[[acme.domains]]
main = "local1.com"
sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
但第一个更通用