“如何修复”;“未查找错误”;在ansible注册变量中解析字典时?
我正在从特定映像创建一些ec2实例,然后尝试获取连接到这些实例的磁盘列表 问题是,当我试图循环创建实例任务中注册的变量时,我得到了一个错误 我试过这篇文章中的解决方案,但没有成功 仅打印“如何修复”;“未查找错误”;在ansible注册变量中解析字典时?,ansible,ansible-template,Ansible,Ansible Template,我正在从特定映像创建一些ec2实例,然后尝试获取连接到这些实例的磁盘列表 问题是,当我试图循环创建实例任务中注册的变量时,我得到了一个错误 我试过这篇文章中的解决方案,但没有成功 仅打印msg:“{{item.block\u device\u mapping}”时,我得到: "msg": { "/dev/sda1": { "delete_on_termination": true, "status": "attached"
msg:“{{item.block\u device\u mapping}”
时,我得到:
"msg": {
"/dev/sda1": {
"delete_on_termination": true,
"status": "attached",
"volume_id": "vol-xxxxxxx"
},
"/dev/xvdb": {
"delete_on_termination": false,
"status": "attached",
"volume_id": "vol-xxxxxx"
},
"/dev/xvdc": {
"delete_on_termination": false,
"status": "attached",
"volume_id": "vol-xxxxxx"
}
}
但是当我使用
msg:{{item.block_device_mapping|map(attribute='volume\u id')}}}“
我得到这个错误:
"msg": "[AnsibleUndefined, AnsibleUndefined, AnsibleUndefined]"
错误: 因此,您犯的主要错误是将
item.block\u device\u mapping
视为您要使用的地图,而不是地图中的地图。也就是说,根据您打印的/dev/sda
,/dev/xvdb
和/dev/xvdc
,您必须首先找到的密钥
因此,首先必须使用父映射的键创建一个数组。您可以看到使Jinja获得必要字符串所需的代码:
# The necessary filter to get that array should be something along these lines
item['block_device_mapping'] | list() | join(', ')
您应该注册它,然后循环,为您提供访问这些元素属性所需的密钥 下面的任务
- debug:
msg: "{{ item }}: {{ block_device_mapping[item].volume_id }}"
loop: "{{ block_device_mapping.keys() }}"
- debug:
msg: "{{ item.block_device_mapping|json_query('*.volume_id') }}"
loop: "{{ ec2.results[0].instances }}"
给出{device:volume_id}元组(grep msg):
要迭代实例,请使用。下面的任务
- debug:
msg: "{{ item }}: {{ block_device_mapping[item].volume_id }}"
loop: "{{ block_device_mapping.keys() }}"
- debug:
msg: "{{ item.block_device_mapping|json_query('*.volume_id') }}"
loop: "{{ ec2.results[0].instances }}"
给出:
"msg": [
"vol-xxxxxx",
"vol-xxxxxx",
"vol-xxxxxxx"
]
和下面的任务
提供列表的列表:
"msg": [
[
"/dev/xvdb",
"vol-xxxxxx"
],
[
"/dev/xvdc",
"vol-xxxxxx"
],
[
"/dev/sda1",
"vol-xxxxxxx"
]
]
和下面的任务
给出元组
"msg": {
"/dev/sda1": "vol-xxxxxxx",
"/dev/xvdb": "vol-xxxxxx",
"/dev/xvdc": "vol-xxxxxx"
}
这是合乎逻辑的,因为item.block\u device\u映射有一个名为/dev/sda1的属性。您可以查看如何列出所有属性名,然后可以循环使用。@HermanTheGermanHesse,非常感谢您的评论和链接。现在工作得很好msg:“{item.block_device_mapping.values()| map(attribute='volume\u id')|list}}”``你介意我把它作为答案发布吗?不,请发:)
- debug:
msg: "{{ dict (item.block_device_mapping.keys()|zip(
item.block_device_mapping|json_query('*.volume_id'))) }}"
loop: "{{ ec2.results[0].instances }}"
"msg": {
"/dev/sda1": "vol-xxxxxxx",
"/dev/xvdb": "vol-xxxxxx",
"/dev/xvdc": "vol-xxxxxx"
}