如何在Terraform的virtual_machine资源中使用共享图像计划数据,例如发布者,商品和sku

时间:2019-11-06 15:38:29

标签: azure terraform terraform-provider-azure terraform0.12+

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

场景:

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

  • 现在,您希望其他团队能够通过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 :(得分:0)

我们可以更好地了解要处理的内容,以便为测试目的添加输出,例如:

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
  }