首页 > 解决方案 > 如何使用 Packer vSphere-ISO HCL2(JSON 语法)映射 network_adapter 和存储块

问题描述

我正在尝试使用 HCL2 JSON 语法构建 VM。如果这是不可能的,这不是交易破坏者;我只是更喜欢使用 JSON 语法,因为我发现以编程方式操作更容易、更清晰。我一直遇到添加 storage 和 network_adapters 复杂类型的问题。我相信这两个关键字都是 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
                }
            ]
        }
    }
}

我也尝试将类型设置为"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
        }
    ]
}

我尝试了以下方法但没有成功:

source.pkr.json(直接赋值)

{
    "source" : {
        "vsphere-iso" : {
            "hcl2-json-build-vm" : {
                "network_adapters" : "${var.network_adapters}",
                "storage" : "${var.storage}"
            }
        }
    }
}

source.pkr.json(飞溅)

{
    "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(动态块)

{
    "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}"
                        }
                    }
                }
            }
        }
    }
}

任何人都可以帮助指出我的错误,或者让我知道目前这是否可能?非常感激!

编辑:为了更好地记录(老实说,给线程一个颠簸)我在尝试定义 network_adapter 和存储在用户变量中并使用 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.

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

标签: jsonpacker

解决方案


经过一番修修补补,我能够在这里得到 SwampDragons 提出的建议。最终的实现看起来像这样,以防将来有人遇到同样的问题:

var-defs.pkr.json
...
"network_adapters": {
    "description": "List of network adapters to add to the VM.",
    "type": "list(map(string))",
    "default": [
        {
            "network": "LLE-Infra",
            "network_card": "vmxnet3"
        }
    ]
},

"storage": {
    "description": "List of virtual disks to add to the VM.",
    "type": "list(map(string))",
    "default": [
        {
            "disk_controller_index": 0,
            "disk_size": 65536,
            "disk_thin_provisioned": true
        }
    ]
}
...
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
    }
]
...
源.pkr.json
...
"dynamic" : {
    "network_adapters" : {
        "for_each": "${var.network_adapters}",
        "content" : {
            "network": "${network_adapters.value.network}",
            "network_card": "${network_adapters.value.network_card}"
        }
    },

    "storage" : {
        "for_each" : "${var.storage}",
        "content"  : {
            "disk_controller_index": "${storage.value.disk_controller_index}",
            "disk_size": "${storage.value.disk_size}",
            "disk_thin_provisioned": "${storage.value.disk_thin_provisioned}"
        }
    }
}
...

推荐阅读