azure - 如何在 Terraform 的 virtual_machine 资源中使用共享镜像计划数据,例如发布者、报价和 sku

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

使用 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 资源中使用必要的 block ,如下所示:

  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、发布商和优惠。

最佳答案

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

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 而言,标识符 block 只是数组中的一个元素。

解决方案:

我们仍然以同样的方式检索数据:

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
  }

关于azure - 如何在 Terraform 的 virtual_machine 资源中使用共享镜像计划数据,例如发布者、报价和 sku,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58733729/

相关文章:

amazon-s3 - Terraform 错误刷新状态访问被拒绝

azure - 将值从 Terraform 动态加载到 map 中

azure - Azure 存储的共享 key

node.js - node_modules 在 Azure 中使用本地 git 一遍又一遍地提交问题

amazon-ec2 - 解析错误 Terraform

azure - 使用 Terraform 添加 AD 组作为现有企业应用程序的成员

azure - Terraform 是否有 Azure ARM "complete"模式?

azure - 如何通过Master登录DC-OS Slave

java - 如何使用java中的身份验证方法连接Azure VM上的WASB

EC2 资源的 Terraform 动态标记失败,带有 `Blocks of type "标记“不在此处”