“如何修复”;“未查找错误”;在ansible注册变量中解析字典时?

“如何修复”;“未查找错误”;在ansible注册变量中解析字典时?,ansible,ansible-template,Ansible,Ansible Template,我正在从特定映像创建一些ec2实例,然后尝试获取连接到这些实例的磁盘列表 问题是,当我试图循环创建实例任务中注册的变量时,我得到了一个错误 我试过这篇文章中的解决方案,但没有成功 仅打印msg:“{{item.block\u device\u mapping}”时,我得到: "msg": { "/dev/sda1": { "delete_on_termination": true, "status": "attached"

我正在从特定映像创建一些ec2实例,然后尝试获取连接到这些实例的磁盘列表

问题是,当我试图循环创建实例任务中注册的变量时,我得到了一个错误

我试过这篇文章中的解决方案,但没有成功

仅打印
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"
}