首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Azure VM扩展设置中为Terraform使用JSON输入映射变量

无法在Azure VM扩展设置中为Terraform使用JSON输入映射变量
EN

Stack Overflow用户
提问于 2022-08-25 21:02:50
回答 1查看 98关注 0票数 0

我正在使用变量类型map为Azure窗口VM创建一个SQL扩展。

我的模块定义如下:

代码语言:javascript
复制
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"]
}

我的变量定义如下:

代码语言:javascript
复制
 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文件如下所示:

代码语言:javascript
复制
   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"
    }
  }
}

当运行“应用程序”时,我将收到以下错误:

代码语言:javascript
复制
Error: unable to parse settings: json: cannot unmarshal string into Go value of type map[string]interface {}

同样的截图:

了解问题的出现是因为JSON输入没有被正确读取,我尝试使用<

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-25 23:21:12

您已经为var.virtual_machine_extensions.settings分配了一个已经包含JSON的字符串,然后在您的主配置中将该字符串传递给Terraform的jsonencode函数,这意味着您要分配一个包含JSON序列化的字符串。

不幸的是,提供程序只是在这里传递底层Go JSON解析器的错误消息,这使得使用Go类型系统术语而不是JSON术语的确切情况变得不清楚,但这真正意味着提供程序需要一个JSON对象,但是您已经分配了一个JSON字符串。

解决方案是删除jsonencode调用,直接将字符串分配给settings,因为该字符串已经包含有效的JSON对象,因此不需要任何进一步的编码:

代码语言:javascript
复制
  settings = each.value.settings
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73493663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档