访问terraform中嵌套对象的值
嗨,我对Terraform和IAC都是新手,所以在工作中学习。我正在编写一个标准的Azure VM模块 我被困在如何访问嵌套映射的值上 我的map变量如下所示:访问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_
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中做到这一点的文档是:。也许有一天它会得到本地支持(希望如此)。您还需要动态块: