如何解决如何使用 Packer vSphere-ISO HCL2JSON 语法映射网络适配器和存储块
我正在尝试使用 HCL2 JSON 语法构建 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
}
]
}
}
}
我也尝试将类型设置为 "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_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_adapters 和存储并使用 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 here 提出的建议生效。最终实现看起来像这样,以防将来有人遇到同样的问题:
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.","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_thin_provisioned" : true
}
]
...
source.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}"
}
}
}
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。