Terraform vsphere_tag 不需要的删除

Terraform vsphere_tag unwanted deletion

我正在使用 Terraform 在我们的 VMware vCenter 基础架构上部署一些开发和生产 VM,并使用 vsphere 标签来定义 VM 的职责。因此,我将以下内容添加到(子)模块:

  resource "vsphere_tag" "tag" {
    name        = "SYS-Team"
    category_id = "Responsibility"
    description = "Systems group"
  }

  ...

  resource "vsphere_virtual_machine" "web" {
    tags             = [vsphere_tag.tag.id]
    ...
  }

现在,当我销毁例如dev infra,它还会删除 prod vsphere 标签并让虚拟机不带标签。

我试图通过生命周期跳过删除,但是我需要单独删除我不喜欢的每个资源。

lifecycle {
  prevent_destroy = true
}

有没有办法在不让 Terraform 管理资源的情况下添加现有标签?没有将标签作为资源包含在内的硬编码内容,例如:

  resource "vsphere_virtual_machine" "web" {
    tags             = [{
      name        = "SYS-Team"
      category_id = "Responsibility"
      description = "Systems group"
      }
    ]
    ...
  }

如果我理解正确的话,真正的问题是:
when I destroy e.g. the dev infra, it also deletes the prod vsphere tag

这不应该发生!
任何跨环境删除都是危险信号

感觉问题出在您的管道中,而不是您的 terraform 代码中...
我创建开发资源的部署管道没有与生产混合,
IF混在一起,你自找麻烦,
您的团队应该将重新设计放在首位


你确实问了:
Is there a way to add an existing tag without having the resource managed by Terraform?

是的,您可以为此使用 PowerCLI:
https://blogs.vmware.com/PowerCLI/2014/03/using-vsphere-tags-powercli.html

添加标签的命令非常简单:
New-Tag –Name “jsmith” –Category “Owner”

您甚至可以使用 null_resource 将其集成到 terraform 代码中,例如:

resource "null_resource" "create_tag" {
  provisioner "local-exec" {
    when        = "create"
    command     = "New-Tag –Name “jsmith” –Category “Owner”"
    interpreter = ["PowerShell"]
  }
}

当您需要从资源中检索一些输出(例如自动生成的 ID)时,您可以使用 Terraform's data sources 来引用不受 Terraform 管理或在不同 Terraform 上下文中管理的内容。

在这种情况下,您可以使用 vsphere_tag data source 来查找标签的 id

data "vsphere_tag_category" "responsibility" {
  name = "Responsibility"
}

data "vsphere_tag" "sys_team" {
  name        = "SYS-Team"
  category_id = data.vsphere_tag_category.responsibility.id
}

...

resource "vsphere_virtual_machine" "web" {
  tags             = [data.vsphere_tag.sys_team.id]
  ...
}

这将使用在外部创建或由 Terraform 在其他地方管理的 vSphere 标记,让您可以轻松地 运行 terraform destroy 销毁 VM 但保留标记。