Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问terraform中嵌套对象的值_Terraform - Fatal编程技术网

访问terraform中嵌套对象的值

访问terraform中嵌套对象的值,terraform,Terraform,嗨,我对Terraform和IAC都是新手,所以在工作中学习。我正在编写一个标准的Azure VM模块 我被困在如何访问嵌套映射的值上 我的map变量如下所示: variable vm_configuration { type = map(object({ vm_resource_group = string vm_rg_location = string vm_as_name = string vm_

嗨,我对Terraform和IAC都是新手,所以在工作中学习。我正在编写一个标准的Azure VM模块

我被困在如何访问嵌套映射的值上

我的map变量如下所示:

variable vm_configuration {
  type = map(object({
    vm_resource_group       = string
    vm_rg_location          = string
    vm_as_name              = string

    vm_name                 = string
    vm_size                 = string

    vm_image_publisher      = string
    vm_image_offer          = string
    vm_image_sku            = string
    vm_image_version        = string

    vm_admin_username       = string
    vm_admin_password       = string

    vm_os_disk_caching      = string
    vm_storage_account_type = string

    # vm_custom_data          = string
    # vm_boot_diag_storage    = string
    vm_tags                   = map(any)

    vm_nics = map(object({
        nic_name        = string <<< I want to access this value. 
        ipconfig_name   = string
        subnet_block_id = string
    }))
  }))
}

正如您已经注意到的,Terraform不支持不同类型的嵌套贴图

幸运的是,有办法克服它。创建一个模板文件(
.tpl
),并使用Terraform函数和解析函数对其进行解析

把我的想法用在你的例子上-

vmconfig.tpl

${jsonencode(
{
“虚拟机资源组”:“mystring”,
“虚拟机位置”:“mystring”,
“vm_as_name”:“mystring”,
“vm_name”:“mystring”,
“虚拟机大小”:“mystring”,
“vm_image_publisher”:“mystring”,
“虚拟机映像提供”:“mystring”,
“虚拟机映像sku”:“mystring”,
“虚拟机映像版本”:“mystring”,
“虚拟机管理员用户名”:“mystring”,
“虚拟机管理员密码”:“mystring”,
“虚拟机操作系统磁盘缓存”:“mystring”,
“虚拟机存储帐户类型”:“mystring”,
“vm_标记”:{},
“虚拟机”:{
“nic_名称”:“mystring”,
“ipconfig_name”:“mystring”,
“子网\u块\u id”:“mystring”
}
}
)}
variables.tf

locals {
    vm_configuration_template = jsondecode(templatefile("${path.module}/vmconfig.tpl", {}))
    vm_configuration_rendered = {
        for key in keys(local.vm_configuration_template) :
        key => local.vm_configuration_template[key]#[var.environment] # optional - values per environment
    }
}
可选注释意味着您甚至可以访问对象的另一个级别,例如,如果您有多个环境
dev
stg
prd
,等等。您可以访问每个环境的值,下面是一个快速示例:

${jsonencode(
{
...
“虚拟机大小”:{
“dev”:“small”,
“stg”:“中等”,
“珠三角”:“中等”
}
...
}
)}
然后,您可以访问每个环境的
vm\u大小
,就像这样
vm\u配置\u呈现的[“vm\u大小”]
。不再需要指定环境关键点,因为它是在渲染过程中拾取的

回到您的示例,变量
vm\u configuration\u rendered
的呈现方式如下:

variable vm_configuration {
  type = map(object({
    vm_resource_group       = string
    vm_rg_location          = string
    vm_as_name              = string

    vm_name                 = string
    vm_size                 = string

    vm_image_publisher      = string
    vm_image_offer          = string
    vm_image_sku            = string
    vm_image_version        = string

    vm_admin_username       = string
    vm_admin_password       = string

    vm_os_disk_caching      = string
    vm_storage_account_type = string

    # vm_custom_data          = string
    # vm_boot_diag_storage    = string
    vm_tags                   = map(any)

    vm_nics = map(object({
        nic_name        = string <<< I want to access this value. 
        ipconfig_name   = string
        subnet_block_id = string
    }))
  }))
}
vm\u配置\u渲染

{
“vm_配置_呈现”:{
“虚拟机管理员密码”:“mystring”,
“虚拟机管理员用户名”:“mystring”,
“vm_as_name”:“mystring”,
“虚拟机映像提供”:“mystring”,
“vm_image_publisher”:“mystring”,
“虚拟机映像sku”:“mystring”,
“虚拟机映像版本”:“mystring”,
“vm_name”:“mystring”,
“虚拟机”:{
“ipconfig_name”:“mystring”,
“nic_名称”:“mystring”,
“子网\u块\u id”:“mystring”
},
“虚拟机操作系统磁盘缓存”:“mystring”,
“虚拟机资源组”:“mystring”,
“虚拟机位置”:“mystring”,
“虚拟机大小”:“mystring”,
“虚拟机存储帐户类型”:“mystring”,
“vm_标记”:{}
}
}
现在,您可以使用访问
nic\u name
中的嵌套值

local.vm_configuration_rendered["vm_nics"]["nic_name"]

我使用了一个我创建的开源工具来在短时间内呈现您的配置。由于我认为我不允许在StackOverflow中“宣传自己的内容”,如果您感兴趣,请告诉我,我会将其名称添加为注释。

关于如何在0.12-0.15中做到这一点的文档是:。也许有一天它会得到本地支持(希望如此)。您还需要动态块: