使用 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/