json - 如何使用 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.
字符串插值似乎没有按预期工作。我做错了吗?
解决方案
经过一番修修补补,我能够在这里得到 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}"
}
}
}
...
推荐阅读
- c - 在 Windows 中使用 Visual Studio 通过 C 代码发送 http URL
- c - 如何减少c语言if语句中的多个OR条件
- forms - 将图像添加到列表视图 xamarin 表单中的轮播
- makefile - GNU make:foreach 在定义和外部表现不同
- python - OperatorNotAllowedInGraphError:不允许使用 `tf.Tensor` 作为 Python `bool`:AutoGraph 确实转换了此函数
- java - 如何计算String java中的逗号
- sql - 根据 SQL 表中 (A) 列中的公共值合并列 (B) 中的值
- python - 在图像上标记特定的像素位置
- php - php 从现有数组中创建列数组
- ios - UIDatePicker iOS 14 中的错误最短时间