I’m trying to build a VM using the HCL2 JSON syntax. It’s not a deal breaker if this is impossible; I just prefer to use the JSON syntax as I find it easier and cleaner to manipulate programmatically. I keep running into the issue of adding storage and network_adapters complex types. Here is what I have currently:
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
}
]
}
}
}
I also tried setting the type as "list(map(string))"
.
var.auto.pkrvars.json:
{
"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
}
]
}
I’ve tried the following approaches with no success:
source.pkr.json (direct assignment):
{
"source" : {
"vsphere-iso" : {
"hcl2-json-build-vm" : {
"network_adapters" : "${var.network_adapters}",
"storage" : "${var.storage}"
}
}
}
}
source.pkr.json (splatting):
{
"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.pkr.json (dynamic blocks):
{
"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}"
}
}
}
}
}
}
}
Can anyone help point out my error, or let me know if this is even possible currently? Much appreciated!