18

私はvars私のansibleプレイブックの中に次のものを持っています。私は次の構造を得ました

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"

配列内のuに注意してください。sans

期待される出力

[[acme.domains]]
  main = "local1.com"
  sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
  main = "local3.com"
[[acme.domains]]
  main = "local4.com"

なぜこれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1

23

これは、Unicode 文字列を含むオブジェクトを出力するu' 'ためです。これは、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 %}

または、後の文字列出力が JSON であり、フィルターsans =を使用してレンダリングするという事実に頼ることができます。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"

しかし、最初のものはより用途が広いです。

于 2017-01-07T13:13:12.917 に答える