Spec-Zone.ru › Ansible 2.8

Версии Python и шаблонизация

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API