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