Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Packer vSphere ISO HCL2(JSON语法)映射网络适配器和存储块_Json_Packer - Fatal编程技术网

如何使用Packer vSphere ISO HCL2(JSON语法)映射网络适配器和存储块

如何使用Packer vSphere ISO HCL2(JSON语法)映射网络适配器和存储块,json,packer,Json,Packer,我正在尝试使用HCL2JSON语法构建一个VM。如果这是不可能的,它不是交易的破坏者;我只是更喜欢使用JSON语法,因为我发现通过编程操作更容易、更清晰。我不断遇到添加存储和网络适配器复杂类型的问题。我相信这两个关键字都属于list(map(string))类型。以下是我目前的情况: var defs.pkr.json: { "variable": { "network_adapters": { "

我正在尝试使用HCL2JSON语法构建一个VM。如果这是不可能的,它不是交易的破坏者;我只是更喜欢使用JSON语法,因为我发现通过编程操作更容易、更清晰。我不断遇到添加存储和网络适配器复杂类型的问题。我相信这两个关键字都属于list(map(string))类型。以下是我目前的情况:

var defs.pkr.json

{
    "variable": {
        "network_adapters": {
            "description": "List of network adapters to add to the VM.",
            "type": "list(object({ network=string, network_card=string }))",
            "default": [
                {
                    "network": "Infra",
                    "network_card": "vmxnet3"
                }
            ]
        },

        "storage": {
            "description": "List of virtual disks to add to the VM.",
            "type": "list(object({ disk_controller_index=number, disk_size=number, disk_thin_provisioned=bool }))",
            "default": [
                {
                    "disk_controller_index": 0,
                    "disk_size": 65536,
                    "disk_thin_provisioned": true
                }
            ]
        }
    }
}
{
    "network_adapters" : [
        {
            "network": "Infra",
            "network_card": "vmxnet3"
        }
    ],

    "storage" : [
        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        },

        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        }
    ]
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : [
                    {
                        "network" : "${var.network_adapters[*].network}",
                        "network_card" : "${var.network_adapters[*].network_card}"
                    }
                ],
                
                "storage" : [
                    {
                        "disk_controller_index" : "${var.storage[*].disk_controller_index}",
                        "disk_size" : "${var.storage[*].disk_size}",
                        "disk_thin_provisioned" : "${var.storage[*].disk_thin_provisioned}"
                    }
                ]
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "dynamic" : {
                    "network_adapters" : {
                        "for_each" : "${var.network_adapters}",
                        "content"  : {
                            "network" : "${network_adapters.network}",
                            "network_card" : "${network_adapters.network_card}"
                        }
                    },

                    "storage" : {
                        "for_each" : "${var.storage}",
                        "content"  : {
                            "disk_controller_index" : "${storage.disk_controller_index}",
                            "disk_size" : "${storage.disk_size}",
                            "disk_thin_provisioned" : "${storage.disk_thin_provisioned}"
                        }
                    }
                }
            }
        }
    }
}
我还尝试将类型设置为
“list(map(string))”

var.auto.pkrvars.json

{
    "variable": {
        "network_adapters": {
            "description": "List of network adapters to add to the VM.",
            "type": "list(object({ network=string, network_card=string }))",
            "default": [
                {
                    "network": "Infra",
                    "network_card": "vmxnet3"
                }
            ]
        },

        "storage": {
            "description": "List of virtual disks to add to the VM.",
            "type": "list(object({ disk_controller_index=number, disk_size=number, disk_thin_provisioned=bool }))",
            "default": [
                {
                    "disk_controller_index": 0,
                    "disk_size": 65536,
                    "disk_thin_provisioned": true
                }
            ]
        }
    }
}
{
    "network_adapters" : [
        {
            "network": "Infra",
            "network_card": "vmxnet3"
        }
    ],

    "storage" : [
        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        },

        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        }
    ]
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : [
                    {
                        "network" : "${var.network_adapters[*].network}",
                        "network_card" : "${var.network_adapters[*].network_card}"
                    }
                ],
                
                "storage" : [
                    {
                        "disk_controller_index" : "${var.storage[*].disk_controller_index}",
                        "disk_size" : "${var.storage[*].disk_size}",
                        "disk_thin_provisioned" : "${var.storage[*].disk_thin_provisioned}"
                    }
                ]
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "dynamic" : {
                    "network_adapters" : {
                        "for_each" : "${var.network_adapters}",
                        "content"  : {
                            "network" : "${network_adapters.network}",
                            "network_card" : "${network_adapters.network_card}"
                        }
                    },

                    "storage" : {
                        "for_each" : "${var.storage}",
                        "content"  : {
                            "disk_controller_index" : "${storage.disk_controller_index}",
                            "disk_size" : "${storage.disk_size}",
                            "disk_thin_provisioned" : "${storage.disk_thin_provisioned}"
                        }
                    }
                }
            }
        }
    }
}
我尝试了以下方法,但没有成功:

source.pkr.json(直接赋值)

{
    "variable": {
        "network_adapters": {
            "description": "List of network adapters to add to the VM.",
            "type": "list(object({ network=string, network_card=string }))",
            "default": [
                {
                    "network": "Infra",
                    "network_card": "vmxnet3"
                }
            ]
        },

        "storage": {
            "description": "List of virtual disks to add to the VM.",
            "type": "list(object({ disk_controller_index=number, disk_size=number, disk_thin_provisioned=bool }))",
            "default": [
                {
                    "disk_controller_index": 0,
                    "disk_size": 65536,
                    "disk_thin_provisioned": true
                }
            ]
        }
    }
}
{
    "network_adapters" : [
        {
            "network": "Infra",
            "network_card": "vmxnet3"
        }
    ],

    "storage" : [
        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        },

        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        }
    ]
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : [
                    {
                        "network" : "${var.network_adapters[*].network}",
                        "network_card" : "${var.network_adapters[*].network_card}"
                    }
                ],
                
                "storage" : [
                    {
                        "disk_controller_index" : "${var.storage[*].disk_controller_index}",
                        "disk_size" : "${var.storage[*].disk_size}",
                        "disk_thin_provisioned" : "${var.storage[*].disk_thin_provisioned}"
                    }
                ]
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "dynamic" : {
                    "network_adapters" : {
                        "for_each" : "${var.network_adapters}",
                        "content"  : {
                            "network" : "${network_adapters.network}",
                            "network_card" : "${network_adapters.network_card}"
                        }
                    },

                    "storage" : {
                        "for_each" : "${var.storage}",
                        "content"  : {
                            "disk_controller_index" : "${storage.disk_controller_index}",
                            "disk_size" : "${storage.disk_size}",
                            "disk_thin_provisioned" : "${storage.disk_thin_provisioned}"
                        }
                    }
                }
            }
        }
    }
}
source.pkr.json(splatting)

{
    "variable": {
        "network_adapters": {
            "description": "List of network adapters to add to the VM.",
            "type": "list(object({ network=string, network_card=string }))",
            "default": [
                {
                    "network": "Infra",
                    "network_card": "vmxnet3"
                }
            ]
        },

        "storage": {
            "description": "List of virtual disks to add to the VM.",
            "type": "list(object({ disk_controller_index=number, disk_size=number, disk_thin_provisioned=bool }))",
            "default": [
                {
                    "disk_controller_index": 0,
                    "disk_size": 65536,
                    "disk_thin_provisioned": true
                }
            ]
        }
    }
}
{
    "network_adapters" : [
        {
            "network": "Infra",
            "network_card": "vmxnet3"
        }
    ],

    "storage" : [
        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        },

        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        }
    ]
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : [
                    {
                        "network" : "${var.network_adapters[*].network}",
                        "network_card" : "${var.network_adapters[*].network_card}"
                    }
                ],
                
                "storage" : [
                    {
                        "disk_controller_index" : "${var.storage[*].disk_controller_index}",
                        "disk_size" : "${var.storage[*].disk_size}",
                        "disk_thin_provisioned" : "${var.storage[*].disk_thin_provisioned}"
                    }
                ]
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "dynamic" : {
                    "network_adapters" : {
                        "for_each" : "${var.network_adapters}",
                        "content"  : {
                            "network" : "${network_adapters.network}",
                            "network_card" : "${network_adapters.network_card}"
                        }
                    },

                    "storage" : {
                        "for_each" : "${var.storage}",
                        "content"  : {
                            "disk_controller_index" : "${storage.disk_controller_index}",
                            "disk_size" : "${storage.disk_size}",
                            "disk_thin_provisioned" : "${storage.disk_thin_provisioned}"
                        }
                    }
                }
            }
        }
    }
}
source.pkr.json(动态块)

{
    "variable": {
        "network_adapters": {
            "description": "List of network adapters to add to the VM.",
            "type": "list(object({ network=string, network_card=string }))",
            "default": [
                {
                    "network": "Infra",
                    "network_card": "vmxnet3"
                }
            ]
        },

        "storage": {
            "description": "List of virtual disks to add to the VM.",
            "type": "list(object({ disk_controller_index=number, disk_size=number, disk_thin_provisioned=bool }))",
            "default": [
                {
                    "disk_controller_index": 0,
                    "disk_size": 65536,
                    "disk_thin_provisioned": true
                }
            ]
        }
    }
}
{
    "network_adapters" : [
        {
            "network": "Infra",
            "network_card": "vmxnet3"
        }
    ],

    "storage" : [
        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        },

        {
            "disk_controller_index" : 0,
            "disk_size" : 65536,
            "disk_thin_provisioned" : true
        }
    ]
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : [
                    {
                        "network" : "${var.network_adapters[*].network}",
                        "network_card" : "${var.network_adapters[*].network_card}"
                    }
                ],
                
                "storage" : [
                    {
                        "disk_controller_index" : "${var.storage[*].disk_controller_index}",
                        "disk_size" : "${var.storage[*].disk_size}",
                        "disk_thin_provisioned" : "${var.storage[*].disk_thin_provisioned}"
                    }
                ]
            }
        }
    }
}
{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "dynamic" : {
                    "network_adapters" : {
                        "for_each" : "${var.network_adapters}",
                        "content"  : {
                            "network" : "${network_adapters.network}",
                            "network_card" : "${network_adapters.network_card}"
                        }
                    },

                    "storage" : {
                        "for_each" : "${var.storage}",
                        "content"  : {
                            "disk_controller_index" : "${storage.disk_controller_index}",
                            "disk_size" : "${storage.disk_size}",
                            "disk_thin_provisioned" : "${storage.disk_thin_provisioned}"
                        }
                    }
                }
            }
        }
    }
}
有谁能帮我指出我的错误,或者让我知道这在目前是否可行?非常感谢

编辑: 为了更好地记录(老实说,给线程一个冲击),我在尝试在用户变量中定义网络适配器和存储以及使用splatting方法时遇到的错误如下:

Error: Incorrect attribute value type
  on source.pkr.json line 39:
  (source code not available)
with var.storage as tuple with 2 elements.
Inappropriate value for attribute "disk_controller_index": number required.

Error: Incorrect attribute value type
  on source.pkr.json line 40:
  (source code not available)
with var.storage as tuple with 2 elements.
Inappropriate value for attribute "disk_size": number required.

Error: Incorrect attribute value type
  on source.pkr.json line 41:
  (source code not available)
with var.storage as tuple with 2 elements.
Inappropriate value for attribute "disk_thin_provisioned": bool required.

Error: Incorrect attribute value type
  on source.pkr.json line 32:
  (source code not available)
with var.network_adapters as tuple with 1 element.
Inappropriate value for attribute "network": string required.

Error: Incorrect attribute value type
  on source.pkr.json line 33:
  (source code not available)
with var.network_adapters as tuple with 1 element.
Inappropriate value for attribute "network_card": string required.

字符串插值似乎没有按预期工作。我做错了吗?

经过一点修补,我终于让沼泽龙提出的建议生效了。如果将来有人遇到同样的问题,最终的实现看起来是这样的:

var-defs.pkr.json var.auto.pkrvars.json source.pkr.json