Terraform vsphere_tag нежелательное удаление

#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}"] . Большое спасибо @ydaetskcoR

2. Сумасшедший, извините, пропустил 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"]
  }
}