从python2迁移到python3后,我遇到了一个问题。似乎迁移以某种方式改变了json查询的处理方式。也许有人暗示如何解决此问题
vars:
vmk_out:
host_vmk_info:
hostname:
[
{
ipv4_address: "10.10.10.101",
ipv4_subnet_mask: "255.255.255.0",
stack: "defaultTcpipStack"
},
{
ipv4_address: "10.10.20.101",
ipv4_subnet_mask: "255.255.255.0",
stack: "vmotion"
}
]
tasks:
- name: Extract list of IPs
set_fact:
output: "{{ vmk_out.host_vmk_info.values() |json_query('[].ipv4_address') }}"
上面在Ansible 2.9.1下运行Python2返回IP地址列表,但在Python3下运行相同返回IP地址列表
答案 0 :(得分:0)
我没有花时间去探究问题的根源,但是在Python 2.7和3.x之间,values()
函数的返回显然存在差异。
这是我的测试中的直接调试或vmk_out.host_vmk_info.values()
的样子:
ansible 2.9.1 - python 3.6
ok: [localhost] => {
"msg": "dict_values([[{'ipv4_address': '10.10.10.101', 'ipv4_subnet_mask': '255.255.255.0', 'stack': 'defaultTcpipStack'}, {'ipv4_address': '10.10.20.101', 'ipv4_subnet_mask': '255.255.255.0', 'stack': 'vmotion'}]])"
}
ansible 2.9.1 - python 2.7
ok: [localhost] => {
"msg": [
[
{
"ipv4_address": "10.10.10.101",
"ipv4_subnet_mask": "255.255.255.0",
"stack": "defaultTcpipStack"
},
{
"ipv4_address": "10.10.20.101",
"ipv4_subnet_mask": "255.255.255.0",
"stack": "vmotion"
}
]
]
}
您有2种解决方案来修复当前代码并使它们与两个版本兼容。
解决方案1 :确保values()
的输出始终产生一个列表:
output: "{{ vmk_out.host_vmk_info.values() | list | json_query('[].ipv4_address') }}"
解决方案2 :停止使用values()
并直接映射现有的hostname
列表
output: "{{ vmk_out.host_vmk_info.hostname | json_query('[].ipv4_address') }}"