Ansible模板添加了' u'在模板中的数组

时间:2017-01-07 11:52:09

标签: ansible jinja2 ansible-2.x ansible-template

我的ansible playbook中有以下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 %}

现在当我进入虚拟机并查看文件时,我得到以下信息:

输出

[[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"

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:13)

你得到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"

但第一个更通用。