使用模块和计数时如何在 terraform 中包含标签

Posted

技术标签:

【中文标题】使用模块和计数时如何在 terraform 中包含标签【英文标题】:How to include tags in terraform when using modules and count 【发布时间】:2022-01-03 16:20:10 【问题描述】:

我必须使用模块配置许多实例并计入其中。问题是,某些特定实例所需的标签必须不同。任何人都可以建议一种更好的方法,可以将标签与所有实例的默认标签一起添加。我使用的是一张所有 30 次出现的地图,很长。

默认标签:tag1,tag2

示例案例:

instance1......instance15     -       tag1,tag2

instance16                    -       tag1,tag2,tag_xxx

instance17......instance29    -       tag1,tag2.

instance30                    -       tag1,tag2,tag_yyy

地形代码:

module "compute-vm" 
  count         = length(var.names)
  source        = "../modules/compute-vm"
  project_id    = var.project_id
  name          = var.name[count.index]
  tags          = var.tags[var.names[count.index]]

variable "tags" 
  type        = map(list(string))



tags.tfvars:

tags= 
    "instance1" = ["tag1","tag2"],
    "instance2"=["tag1","tag2"],
    "instance3" = ["tag1","tag2"],
.
.
.
.

    "instance16"=["tag1","tag2",tag_xxx]

【问题讨论】:

【参考方案1】:

您可以使用concat 连接两个列表。 大致如下:

variable "default_tags" 
  type = list(string)


module "compute-vm" 
  ...
  tags = concat(var.default_tags, var.tags[var.names[count.index]])


另外,我会使用for_each 而不是count。这使得块更容易阅读。此外,您稍后可以通过module.compute-vm["instance1"] 引用该块,而不必使用索引module.compute-vm[0]。因为谁知道第一个虚拟机是否真的是"instance1"(也许 Terraform 会改变地图内的顺序)。

module "compute-vm" 
  for_each   = var.tags
  source     = "../modules/compute-vm"
  project_id = var.project_id
  name       = each.key
  tags       = each.value  // or concat(var.default_tags, each.value)

【讨论】:

以上是关于使用模块和计数时如何在 terraform 中包含标签的主要内容,如果未能解决你的问题,请参考以下文章

使用browserify时如何在AngularJS中包含jQuery?

当计数为零时熊猫 groupby 以及如何在结果中包含零值

如何在查询中包含零计数结果

如何在模块中包含 *.py 以外的文件?

当模块名称中包含“-”破折号或连字符时如何导入模块?

如何将代码模块中包含的VBA代码放在表单模块中