模板中的 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()
使您的剧本和模板与 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
的信息,请参阅 字典视图 条目。