Azure 如何在Terraform的虚拟机资源中使用共享的镜像计划数据,如发布者、产品和sku

Azure 如何在Terraform的虚拟机资源中使用共享的镜像计划数据,如发布者、产品和sku,azure,terraform,terraform-provider-azure,terraform0.12+,Azure,Terraform,Terraform Provider Azure,Terraform0.12+,使用Terraform v0.12.9,azurerm provider v1.36.1 情景: 您已经基于第三方市场映像创建了一个映像 您已将此图像发布到共享图像库 您已经能够使用Terraform和Azure Devops管道以自动化的方式实现这一点。(例如,CIS硬化图像) 对于上述每个步骤,您都提供了计划信息数据。否则,您将无法从此映像创建VM,因为使用marketplace映像会带来额外的成本 现在,您希望其他团队能够通过Terraform Automation使用共享图像库中的图像

使用Terraform v0.12.9,azurerm provider v1.36.1

情景:

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

  • 现在,您希望其他团队能够通过Terraform Automation使用共享图像库中的图像

如何从共享图像中获取计划信息而无需硬编码

嗯,我想使用数据源检索数据,使用:

data "azurerm_shared_image" "image" {
  name                = var.image_name
  gallery_name        = var.gallery_name
  resource_group_name = var.rsg_name
}
并在虚拟机资源中使用必要的块,如下所示:

  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
  }
  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
  }
但是,我得到一个错误声明:

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\u shared\u image.image.identifier.sku
在这里也不起作用。就地形而言,标识符块只是阵列中的一个元素

解决方案: 我们检索数据的方式仍然相同:

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

我们在虚拟机资源中引用它,如下所示:

  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
  }
  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
  }