Как использовать данные плана shared_image, такие как издатель, предложение и sku, в ресурсе virtual_machine в Terraform - PullRequest
0 голосов
/ 06 ноября 2019

Использование Terraform v0.12.9, провайдера Azurerm v1.36.1

Сценарий:

  • Вы создали изображение на основе стороннего образа торговой площадки.
  • Вы опубликовали это изображение в галерее общих изображений.
  • Вы можете сделать это в автоматическом режиме с использованием конвейеров Terraform и Azure Devops. (например, закаленные изображения CIS)
  • Для каждого из этих предыдущих шагов вы предоставили данные о плане. в противном случае вы не сможете создать виртуальную машину из этого образа, поскольку с использованием образа торговой площадки связаны дополнительные расходы.

  • Теперь вы хотите, чтобы другие команды могли использоватьваше изображение из галереи общих изображений с помощью Terraform Automation.

Как получить информацию о плане из общего изображения без его жесткого кодирования?

Что ж, я подумалпросто получите данные, используя источник данных, используя:

data "azurerm_shared_image" "image" {
  name                = var.image_name
  gallery_name        = var.gallery_name
  resource_group_name = var.rsg_name
}

и используя необходимые блоки внутри ресурса virtual_machine, например:

  storage_image_reference {
    id = data.azurerm_shared_image.image.id
  }

  plan {
    name      = data.azurerm_shared_image.image.sku
    publisher = data.azurerm_shared_image.image.publisher
    product   = data.azurerm_shared_image.image.offer
  }

Однако я получаю сообщение об ошибке:

Error: Unsupported attribute
This object has no argument, nested block, or exported attribute named "sku".

для каждого sku, издателя и предложения.

1 Ответ

0 голосов
/ 06 ноября 2019

Мы можем получить более полное представление о том, с чем мы имеем дело, чтобы добавить вывод для целей тестирования, например:

output "imagedata" {
  value = data.azurerm_shared_image.image
}

Мы получаем важную информацию:

imagedata = {
  "description" = ""
  "eula" = ""
  "gallery_name" = [removed]
  "id" = [removed]
  "identifier" = [
    {
      "offer" = "cis-centos-7-l1"
      "publisher" = "center-for-internet-security-inc"
      "sku" = "cis-centos75-l1"
    },
  ]
  "location" = [removed]
  "name" = [removed]
  "os_type" = "Linux"
  "privacy_statement_uri" = ""
  "release_note_uri" = ""
  "resource_group_name" = [removed]
  "tags" = {}
}

Ах, теперь использование data.azurerm_shared_image.image.identifier.sku здесь тоже не сработает. Что касается Terraform, блок идентификатора содержит только один элемент в массиве.

Решение:

Мы извлекаем данные все так же:

data "azurerm_shared_image" "image" {
  name                = var.image_name
  gallery_name        = var.gallery_name
  resource_group_name = var.rsg_name
}

И мы ссылаемся на них в нашем ресурсе virtual_machine, например:

  storage_image_reference {
    id = data.azurerm_shared_image.image.id
  }

  plan {
    name      = data.azurerm_shared_image.image.identifier[0].sku
    publisher = data.azurerm_shared_image.image.identifier[0].publisher
    product   = data.azurerm_shared_image.image.identifier[0].offer
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...