【问题标题】:Using map of sets in resource creation在资源创建中使用集合映射
【发布时间】:2021-11-30 03:57:32
【问题描述】:

我有一个集合对象的地形图,如下所示

variable "BName" {
 type = string
 }
variable "type_names" {
 type = map(object({
 name   = string
 type   = string
 stream = string
 grp    = optional(string)
 }))
}

我也在尝试在以下资源中使用 type_name。 我们如何在资源创建过程中从集合映射中引用值

resource "azure_resource" "reso" {
  id = az_resource.B_Name.id
  name       = var.type_names.name

 }
resource "az_resource" "B_Name" {
  name        = var.BName

}

如何在 terraform.tfvars 文件中传递此值以创建以下资源。现在我正在尝试通过以下方式

 BName  = "Test"
 type_names =   {
   name = "cooper"
   type = "senior"
   stream=  "developer"
   grp   =  "Mid"
}
{
   name = "Mike"
   type = "Junior"
   stream=  "tester"
   grp   =  "entry"
}

【问题讨论】:

  • 能否请您更新您的示例变量值?它们的类型是 object,而不是 map(set(object))。此外,如果您可以改用set(object)map(object),那两者都会更容易。
  • @MattSchuchard 我已经更新了变量。你能帮忙吗
  • 如果你有map(object),那么你可以正常使用for_each元参数:terraform.io/docs/language/meta-arguments/for_each.html。这不适合你吗?
  • 但是我如何在 terraform.tfvars 中给出值。想知道我给出的格式是否正确
  • 好的,我现在看到map 的文档示例是错误的。我想在这一点上我可以写一个答案。

标签: amazon-web-services azure terraform


【解决方案1】:

对于使用map(object) 变量输入的单个定义创建多个资源,存在通用算法和模式。首先,我们需要声明中的变量结构定义。对于您的示例,我们有:

variable "type_names" {
  type = map(object({
    name   = string
    type   = string
    stream = string
    grp    = optional(string)
  }))
}

鉴于关键字optional 的出现,我假设对可选对象键使用实验性功能。在这种情况下,资源具有描述性标识符会很有帮助。那很可能是name,因此我们可以将它从object 值中删除,并将其重构为map 键。使用符合类型定义的示例 default 更新定义将是:

variable "type_names" {
  type = map(object({
    type   = string
    stream = string
    grp    = optional(string)
  }))
  default = {
    "cooper" = {
      type   = "senior"
      stream = "developer"
      grp    = "Mid"
    },
    "Mike" = {
      type   = "Junior"
      stream = "tester"
      grp    = "entry"
    }
  }
}

然后我们可以轻松地使用它来管理具有单个定义和输入变量的多个资源。由于问题中的示例资源使用的键与提供的变量所拥有的键不同,因此我们将稍微修改示例资源:

resource "azure_resource" "this" {
  for_each = var.type_names

  # value is the object, so we access object values with standard `.key` syntax
  name   = each.key
  type   = each.value.type
  stream = each.value.stream
  grp    = each.value.grp
}

每个资源的命名空间将是azure_resource.this["<key>"],例如azure_resource.this["Mike"],可以正常访问其属性。

【讨论】:

  • 谢谢@MattSchuchard 但我遇到了一个错误。此默认值与变量的类型约束不兼容:元素“cooper”:属性“name”是必需的。我是否也可以在默认地图中添加名称
  • @tjdoubts 请使用我在答案中提供的配置并阅读配置说明。我的回答没有抛出那个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多