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"
Обратите внимание на вас внутри sans
массив.
Ожидаемый выход
[[acme.domains]]
main = "local1.com"
sans = ["test.local1.com", "test2.local.com"]
[[acme.domains]]
main = "local3.com"
[[acme.domains]]
main = "local4.com"
Почему это происходит и как я могу это исправить?
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"
Но первый более универсален.