0

使用 Terraform v0.12.9,azurerm 提供程序 v1.36.1

设想:

  • 您已基于第三方市场映像创建了映像。
  • 您已将此图像发布到共享图像库。
  • 您已经能够使用 Terraform 和 Azure Devops 管道以自动化方式执行此操作。(例如 CIS 硬化图像)
  • 对于上述每个步骤,您都提供了计划信息数据。否则,您将无法从此映像创建 VM,因为使用市场映像会产生额外费用。

  • 现在,您希望其他团队能够通过 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.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、出版商和报价。

4

1 回答 1

1

我们可以更好地了解我们正在处理什么以添加用于测试目的的输出,如下所示:

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
  }
于 2019-11-06T15:38:29.367 回答