Шаблон Ansible добавляет 'u' в массив в шаблоне

У меня есть следующий 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"

Обратите внимание на u внутри массива sans.

Ожидаемый результат

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

Почему это происходит и как это исправить?


person Steve    schedule 07.01.2017    source источник
comment
В итоге я сбросил переменную в json, и он исправил ее (для jinja2). stackoverflow.com/a/50612950/999943   -  person phyatt    schedule 30.05.2018


Ответы (1)


Вы получаете 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"

Но первый более универсален.

person techraf    schedule 07.01.2017
comment
Внимание: на самом деле это tojson, а не to_json. См .: jinja.pocoo.org/docs/2.10/templates/#tojson - person miron; 13.09.2018
comment
Ansible предоставляет to_json filter, и это что я хотел использовать. - person techraf; 13.09.2018