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 但保留标记。
我正在使用 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 但保留标记。