在模板中使用 Python3

Ansible 使用 Jinja2 来利用模板和变量中的 Python 数据类型和标准函数。你可以使用这些数据类型和标准函数对数据执行丰富的操作。但是,如果你使用模板,则必须注意 Python 版本之间的差异。

这些主题可帮助你设计在 Python2 和 Python3 上都适用的模板。如果你要从 Python2 升级到 Python3,它们也可能会有所帮助。在 Python2 或 Python3 中进行内部升级通常不会引入影响 Jinja2 模板的更改。

字典视图

在 Python2 中,dict.keys()dict.values()dict.items() 方法返回一个列表。Jinja2 使用字符串表示形式将其返回给 Ansible,而 Ansible 可以将其转换回列表。

在 Python3 中,这些方法返回一个 字典视图 对象。Jinja2 返回的用于字典视图的字符串表示形式无法被 Ansible 解析回列表。但是,通过在使用 dict.keys()dict.values()dict.items() 时始终使用 list 过滤器,可以很容易地使其可移植。

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 字典没有这些方法。使用 dict.keys()dict.values()dict.items() 使你的 Playbook 和模板与 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 }}"

另请参阅