模板中的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
的信息,请参阅字典视图条目。