首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform尝试参数存在

Terraform尝试参数存在
EN

Stack Overflow用户
提问于 2021-05-16 16:48:36
回答 1查看 46关注 0票数 1

我们已经为给定的模块定义了变量。这是一个样本

代码语言:javascript
复制
    variable "kv_name_solution" { }
    variable "kv_name_seqnr" { }
    variable "kv_name_purpose" { }
...    
    variable "location_name" { default = "Europe" }
    variable "location_tier" { default = "Primary" }  
    variable "rg_name_solution" { default = "edw"}
    variable "rg_name_seqnr" { default = "001"}

在我们的tfvar中,准备了大量的kv。因此,在模板中,我们使用以下代码

代码语言:javascript
复制
module "kv_create" {
  for_each = var.resources_kv
  source = "../../_modules/security/kv_create"

  kv_name_solution        = each.value["kv_name_solution"]
  kv_name_seqnr           = each.value["kv_name_seqnr"]
  kv_name_purpose         = each.value["kv_name_purpose"]
...
  location_name        = each.value["location_name"]
  location_tier        = each.value["location_tier"]
  rg_name_solution     = each.value["rg_name_solution"]
  rg_name_seqnr        = each.value["rg_name_seqnr"]
}

但是,我正在尝试找到一种方法,当在tfvar中,例如rg_name_solution和rg_name_seqnr被省略时,for_each中的代码仍然有效。我一直在尝试搜索,但到目前为止还没有找到正确的结果。

因为location_name = try(each.value["location_name"], null)似乎取消了我在变量上的默认设置。

有什么建议吗?

这些是“完整的文件”

terraform.tfvars

代码语言:javascript
复制
rg_resources = {
        "edw-common" = {

                rg_name_solution        = "edw"
                rg_name_seqnr           = "001"

                rg_location_name        = "Europe"
                rg_location_tier        = "Primary"
        }
}

kv_resources = {
        "adf-001" = {
                kv_name_solution        = "edw"
                kv_name_seqnr           = "001"
                kv_name_purpose         = "adfxx"

                }
}

main.tf

代码语言:javascript
复制
....
module "provision_keyvaults" {
  count     = (var.MODULE == "KV") || ((var.MODULE == "ALL" && var.APPLY == "false")) ? 1 : 0
  source    = "./_templates/kv"

  resources_kv = var.kv_resources
}
....

template\kv\main.tf

代码语言:javascript
复制
module "kv_create" {
  for_each = var.resources_kv
  source = "../../_modules/security/kv_create"

  kv_location_name        = try(each.value["kv_location_name"],null)
  kv_location_tier        = try(each.value["kv_location_tier"],null)

  kv_name_solution        = each.value["kv_name_solution"]
  kv_name_seqnr           = each.value["kv_name_seqnr"]
  kv_name_purpose         = each.value["kv_name_purpose"]

  rg_name_solution        = try(each.value["rg_name_solution"],null)
  rg_name_seqnr           = try(each.value["rg_name_seqnr"],null)

 }

template\kv\variables.tf

代码语言:javascript
复制
variable "resources_kv" { }

_modules\kv_create\variables.tf

代码语言:javascript
复制
variable "kv_location_name" {
                              default = "Europe"
                            }
variable "kv_location_tier" {
                              default = "Primary"
                            }

variable "kv_name_solution" { }
variable "kv_name_seqnr" { }
variable "kv_name_purpose" { }

variable "rg_name_solution" {
                              default = "edw"
                            }
variable "rg_name_seqnr" {
                           default = "001"
                         }

_modules\kv_create\main.tf

代码语言:javascript
复制
module "subscription" {
  source = "../../general/subscription_getdetails"
}

module "kv_location" {
  source = "../../general/location_getdetails"
  location_name = var.kv_location_name
  location_tier = var.kv_location_tier
}

module "resourcegroup" {
  source = "../../general/rg_getdetails"
  rg_name_solution = var.rg_name_solution
  rg_name_seqnr    = var.rg_name_seqnr
}

data "azurerm_client_config" "current" {}

resource "azurerm_key_vault" "kv" {
  count                       = var.kv_provision ? 1 : 0

  name                        = "kv-${module.kv_location.sitecode}-${module.subscription.environment}-${var.kv_name_solution}-${var.kv_name_seqnr}-${var.kv_name_purpose}"

....

  resource_group_name         = module.resourcegroup.rg.name
  location                    = module.kv_location.azure
...
}

和底线,错误

代码语言:javascript
复制
╷
│ Error: Invalid template interpolation value
│ 
│   on _modules/general/rg_getdetails/main.tf line 18, in data "azurerm_resource_group" "rg":
│   18:   name = "rg-${module.subscription.environment}-${var.rg_name_solution}-${var.rg_name_seqnr}"
│     ├────────────────
│     │ var.rg_name_solution is null
│ 
│ The expression result is null. Cannot include a null value in a string
│ template.
╵
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-17 07:55:22

如果没有显式指定,我将只使用lookup来提供默认值。例如:

代码语言:javascript
复制
  kv_name_solution        = lookup(each.value, "kv_name_solution", var.kv_name_solution)
  kv_name_seqnr           = lookup(each.value, "kv_name_seqnr", var.kv_name_seqnr)
  kv_name_purpose         = lookup(each.value, "kv_name_purpose", var.kv_name_purpose)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67554669

复制
相关文章

相似问题

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