Версии Python и Шаблонизация
Шаблоны Jinja2 используют типы данных Python и стандартные функции. Это обеспечивает богатый набор операций, которые можно выполнять над данными. Однако это также означает, что некоторые особенности базового Python становятся видимыми для авторов шаблонов. Поскольку Ansible playbook использует Jinja2 для шаблонов и переменных, это означает, что авторы playbook также должны быть осведомлены об этих особенностях.
Если не указано иное, эти различия интересны только при запуске 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. Playbook и шаблоны 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.5/user_guide/playbooks_python_version.html