4

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

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

  ...

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

现在,当我销毁例如 dev 基础设施时,它还会删除 prod vsphere 标签,并让虚拟机没有标签。

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

lifecycle {
  prevent_destroy = true
}

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

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

2 回答 2

3

当您需要从资源中检索某些输出(例如自动生成的 ID)时,您可以使用Terraform 的数据源来引用不由 Terraform 管理或在不同 Terraform 上下文中管理的事物。

在这种情况下,您可以使用vsphere_tag数据源来查找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 但保留标签。

于 2021-08-31T14:48:32.907 回答
1
于 2021-08-31T13:57:34.497 回答