如何从 ansible 输出访问 JSON 值?

How to I access JSON value from ansible output?

我有这个 ansible 剧本,它将使用 ec2_vol 模块创建卷并将其附加到 EC2 实例,我想使用 parted 模块对其进行分区。下面是我的 ec2_vol 模块,

EC2_VOL 模块:

      ec2_vol:
        aws_access_key: XXXXXXXX
        aws_secret_key: XXXXXXXX
        security_token: XXXXXXXX
        instance: "{{ item.instance_id }}"
        region: "{{ var_dict['REGION'] }}"
        device_name: "{{ VOL_NAME }}"
        volume_type: gp2 
        volume_size: '1000'
        delete_on_termination: false
      with_items: "{{ ec2_instances_list.instances}}"
      register: ec2_volumes    
    - debug:
        msg: "{{ ec2_volumes.results }}"

ec2_vol计算结果:

以及从 ec2_volumes.results 打印的结果。我想遍历 device_name 并对创建的设备进行分区

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        {
            "_ansible_ignore_errors": null, 
            "_ansible_item_label": {
                "ami_launch_index": 0, 
                "architecture": "x86_64", 
                "block_device_mappings": [
                    {
                        "device_name": "/dev/sda1", 
                        "ebs": {
                            "attach_time": "2021-04-30T15:47:07+00:00", 
                            "delete_on_termination": true, 
                            "status": "attached", 
                            "volume_id": "vol-XXXXXXXXXXXXXX"
                        }
                    }, 
                    {
                        "device_name": "/dev/sdb", 
                        "ebs": {
                            "attach_time": "2021-04-30T15:47:07+00:00", 
                            "delete_on_termination": false, 
                            "status": "attached", 
                            "volume_id": "vol-XXXXXXXXXXXXXXXX"
                        }
                    }
                ], 

这是我分开的模块代码:

    - name: Partition Additional volumes 
      parted:
        device: "{{ item.block_device_mappings[0].device_name }}"
        number: 1
        part_type: 'primary'
        state: present
        when: ("{{ ec2_volumes.device_name }}" != "/dev/sda1")
      with_items: "{{ ec2_volumes.results}}"

但仍然收到 'block_device_mappings' 没有属性的错误。

fatal: [localhost]: FAILED! => {"msg": "'list object' has no attribute 'block_device_mappings'"}

可能是什么原因?有人可以帮我解决这个问题吗?

编辑 1:

更新 parted 模块中的剧本后面临另一个问题

    - name: Partition Additional volumes 
      parted:
        device: "{{ item._ansible_item_label.block_device_mappings[0].device_name }}"
        number: 1
        part_type: 'primary'
        state: present
        when: ("{{ ec2_volumes.device_name }}" != "/dev/sda1")
      with_items: "{{ ec2_volumes.results}}"
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'device_name'

错误很明显:

FAILED! => {"msg": "'list object' has no attribute 'block_device_mappings'"}

当您查看列表时,您会看到 block_device_mappings_ansible_item_label[=21 的属性=]

    "msg": [
        {
            "_ansible_ignore_errors": null, 
            "_ansible_item_label": {
                "ami_launch_index": 0, 
                "architecture": "x86_64", 
                "block_device_mappings": [
                ...

修复引用


    device: "{{ item._ansible_item_label.block_device_mappings[0].device_name }}"