【问题标题】:Terraform vsphere_tag unwanted deletionTerraform vsphere_tag 不需要的删除
【发布时间】:2021-04-02 01:54:41
【问题描述】:

我正在使用 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"
      }
    ]
    ...
  }

【问题讨论】:

    标签: terraform terraform-provider-vsphere


    【解决方案1】:

    当您需要从资源中检索某些输出(例如自动生成的 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 但保留标记。

    【讨论】:

    • 这行得通,但我必须设置tags = ["${data.vsphere_tag.sys_team.id}"]。非常感谢@ydaetskcoR
    • Derp,抱歉,当我从您的问题中复制和粘贴时,错过了 data. 前缀以表明它是数据源。现在修好了。除非您使用的是 Terraform 0.11 或更低版本,否则您不应该需要插值。
    【解决方案2】:

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

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

    感觉问题出在您的管道中,而不是您的 terraform 代码...
    我创建开发资源的部署管道不与产品混合,
    如果它们是混合的,你只是在自找麻烦,
    您的团队应该将重新设计作为重中之重


    你问:
    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"]
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2012-02-24
      • 2011-04-03
      相关资源
      最近更新 更多