#terraform #terraform-provider-vsphere
#терраформирование #terraform-провайдер-vsphere
Вопрос:
Я использую Terraform для развертывания некоторых виртуальных машин dev и prod в нашей инфраструктуре 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]
...
}
Теперь, когда я уничтожаю, например, инфраструктуру разработчика, она также удаляет тег prod vsphere и оставляет виртуальные машины без тега.
Я попытался пропустить удаление с жизненным циклом, но тогда мне нужно было бы отдельно удалять каждый ресурс, который мне не нравится.
lifecycle {
prevent_destroy = true
}
Есть ли способ добавить существующий тег без использования ресурса, управляемого Terraform? Что-то жестко запрограммированное без включения тега в качестве ресурса, например:
resource "vsphere_virtual_machine" "web" {
tags = [{
name = "SYS-Team"
category_id = "Responsibility"
description = "Systems group"
}
]
...
}
Ответ №1:
Вы можете использовать источники данных 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]
...
}
При этом будет использоваться тег vSphere, который либо был создан извне, либо управлялся Terraform в другом месте, что позволяет легко выполнить terraform destroy
удаление виртуальной машины, но сохранить тег.
Комментарии:
1. Это сработало, но я должен был установить
tags = ["${data.vsphere_tag.sys_team.id}"]
. Большое спасибо @ydaetskcoR2. Сумасшедший, извините, пропустил
data.
префикс, указывающий на то, что это источник данных, когда я копировал и вставлял ваш вопрос. Исправлено. Вам не нужна интерполяция там, если вы не используете Terraform 0.11 или ниже.
Ответ №2:
Если я правильно понял, настоящая проблема в:
when I destroy e.g. the dev infra, it also deletes the prod vsphere tag
Этого не должно происходить!
любое перекрестное удаление среды — это красный флаг
Похоже, проблема в вашем конвейере, а не в коде terraform…
Конвейеры развертывания, которые я создаю для ресурсов разработчика, не смешиваются с prod,
и ЕСЛИ они смешаны, вы просто напрашиваетесь на неприятности,
ваша команда должна сделать перепроектирование приоритетным
Вы спрашиваете:
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”
Вы могли бы даже интегрировать это в код terraform с помощью null_resource что-то вроде:
resource "null_resource" "create_tag" {
provisioner "local-exec" {
when = "create"
command = "New-Tag –Name “jsmith” –Category “Owner”"
interpreter = ["PowerShell"]
}
}