我正在使用变量类型map为Azure窗口VM创建一个SQL扩展。
我的模块定义如下:
resource "azurerm_virtual_machine_extension" "virtual_machine_extension"{
for_each = var.virtual_machine_extensions
name = each.value["name"]
virtual_machine_id = lookup(var.virtual_machine_ids, each.value["virtual_machine_variable_name"], null)
publisher = each.value["publisher"]
type = each.value["type"]
type_handler_version = each.value["type_handler_version"]
settings = jsonencode(each.value["settings"])
tags = each.value["virtual_machine_extension_tags"]
}我的变量定义如下:
variable "virtual_machine_extensions" {
type = map(object({
name = string
virtual_machine_variable_name = string
publisher = string
type = string
type_handler_version = string
settings = any
virtual_machine_extension_tags = map(string)
}))
}
variable "virtual_machine_ids" {
type = map(string)
default = {}
}virtual_machine_ids将拥有从主文件传递给它的虚拟机列表及其相应的ids。
我的tfvars文件如下所示:
virtual_machine_extensions = {
virtual_machine_extension_sql ={
name = "vmsqlext" #Required
virtual_machine_variable_name = "windows_virtual_machine1"
publisher = "Microsoft.SqlServer.Management"
type = "SqlIaaSAgent"
type_handler_version = "1.2"
settings =<<SETTINGS
{
"AutoTelemetrySettings": {
"Region": "West Europe"
},
"AutoPatchingSettings": {
"PatchCategory": "WindowsMandatoryUpdates",
"Enable": true,
"DayOfWeek": "Sunday",
"MaintenanceWindowStartingHour": "2",
"MaintenanceWindowDuration": "60"
},
"KeyVaultCredentialSettings": {
"Enable": false,
"CredentialName": ""
},
"ServerConfigurationsManagementSettings": {
"SQLConnectivityUpdateSettings": {
"ConnectivityType": "Public",
"Port": "1433"
},
"SQLWorkloadTypeUpdateSettings": {
"SQLWorkloadType": "GENERAL"
},
"AdditionalFeaturesServerConfigurations": {
"IsRServicesEnabled": "true"
},
"protectedSettings": {}
}
}
SETTINGS
virtual_machine_extension_tags = {
applicationName = "Windows VM Extension"
approver = "IT Infrastructure"
}
}
}当运行“应用程序”时,我将收到以下错误:
Error: unable to parse settings: json: cannot unmarshal string into Go value of type map[string]interface {}同样的截图:

了解问题的出现是因为JSON输入没有被正确读取,我尝试使用<
发布于 2022-08-25 23:21:12
您已经为var.virtual_machine_extensions.settings分配了一个已经包含JSON的字符串,然后在您的主配置中将该字符串传递给Terraform的jsonencode函数,这意味着您要分配一个包含JSON序列化的字符串。
不幸的是,提供程序只是在这里传递底层Go JSON解析器的错误消息,这使得使用Go类型系统术语而不是JSON术语的确切情况变得不清楚,但这真正意味着提供程序需要一个JSON对象,但是您已经分配了一个JSON字符串。
解决方案是删除jsonencode调用,直接将字符串分配给settings,因为该字符串已经包含有效的JSON对象,因此不需要任何进一步的编码:
settings = each.value.settingshttps://stackoverflow.com/questions/73493663
复制相似问题