Версии Python и Шаблонизация
Шаблоны Jinja2 используют типы данных Python и стандартные функции. Это обеспечивает богатый набор операций, которые могут быть выполнены над данными. Однако это также означает, что некоторые особенности базового Python становятся видимыми для авторов шаблонов. Поскольку Ansible-скрипты используют Jinja2 для шаблонов и переменных, это означает, что авторы скриптов также должны быть осведомлены об этих особенностях.
Если не указано иное, эти различия интересны только при выполнении Ansible в Python2 по сравнению с Python3. Изменения внутри Python2 и Python3, как правило, достаточно незначительны, чтобы они не были видны на уровне Jinja2.
Представления словарей
В Python2 методы dict.keys(), dict.values() и dict.items() возвращают список. Jinja2 возвращает это Ansible в виде строкового представления, которое Ansible может преобразовать обратно в список. В Python3 эти методы возвращают объект представления словаря. Строковое представление, возвращаемое Jinja2 для представлений словаря, не может быть обработано обратно в список Ansible. Однако легко сделать это переносимым, используя фильтр list при использовании dict.keys(), dict.values() или dict.items():
vars:
hosts:
testhost1: 127.0.0.2
testhost2: 127.0.0.3
tasks:
- debug:
msg: '{{ item }}'
# Only works with Python 2
#loop: "{{ hosts.keys() }}"
# Works with both Python 2 and Python 3
loop: "{{ hosts.keys() | list }}"
dict.iteritems()
В Python2 словари имеют методы iterkeys(), itervalues() и iteritems(). Эти методы были удалены в Python3. Скрипты и шаблоны Jinja2 должны использовать dict.keys(), dict.values() и dict.items() для обеспечения совместимости с Python2 и Python3:
vars:
hosts:
testhost1: 127.0.0.2
testhost2: 127.0.0.3
tasks:
- debug:
msg: '{{ item }}'
# Only works with Python 2
#loop: "{{ hosts.iteritems() }}"
# Works with both Python 2 and Python 3
loop: "{{ hosts.items() | list }}"
См. также
- Запись Представления словарей для получения информации о том, почему здесь необходим
list filter.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_python_version.html