Azure Image Builder - 以编程方式定位特定图像模板构建的打包程序日志

Azure Image Builder - programmatically locating packer logs for specific image template build

tl;dr

我如何以编程方式从 Azure Image Builder 模板构建的实例向下钻取以找到构建的 customization.log 文件?


长版

我最近开始使用 Azure Image Builder,经过一段时间后,我得到了一个 CI 管道,用于将源存储库中的文件部署和构建图像模板到共享图像库中。

在我的构建过程结束时,我想检索由 Azure Image Builder 生成的 packerlogs\<guid>\customization.log 文件 - 我可以通过在门户中四处单击来找到它(见下面的屏幕截图),但我我正在努力按照任何类型的面包屑路径以编程方式定位 blob。

也许有一种非常简单的方法可以做到这一点,我正在用它做一个巨大的猪耳朵,但这是我目前所得到的:

  1. 在构建过程中,Azure Image Builder 会创建一个名为 IT_<gallery-resource-group-name>_<image-template-name>_<guid> 的临时资源组,用于存储自定义日志。这还有以下标签可用于查找正确的资源组:

    • "createdBy" = "AzureVMImageBuilder"
    • "imageTemplateResourceGroupName" = "<shared image gallery resource group name>"
    • "imageTemplateName" = "<image template name>"
  2. 在临时资源组中有一个具有 24 个字符随机名称的存储帐户 - 例如abc123def456ghi789j01234

  3. 在存储帐户中有一个名为 packerlogs

    的容器
  4. 并且在存储帐户容器中,一些 blob 以 <guid>\customization.log.

    格式存在
  5. 到目前为止,我不知道要使用哪个 <guid> 来过滤特定构建实例的结果。我可以使用时间戳来读取 最新的 一个,但我怎么知道它是否适合我的图像模板的任何给定构建。例如,哪个 <guid> 属于我的图像模板的图像版本 1.0.55 的构建过程?

这是我目前得到的代码:

# this is my starting point - I've got an image template that I've built using Start-AzImageBuilderTemplate
# and it's successfully created a new image version in a shared image gallery
$myImageGallery    = ...
$myImageDefinition = ...
$myImageTemplate   = ...
$myImageVersion    = ...


# find the temporary resource group with the appropriate tags for the image template
$temporaryResourceGroup = Get-AzResourceGroup -Tag @{ "createdBy" = "AzureVMImageBuilder" } `
     | where-object {
         ($_.Tags.imageTemplateResourceGroupName -eq $myImageGallery.ResourceGroupName) -and
         ($_.Tags.imageTemplateName -eq $myImageTemplate.Name)
     };

# get a reference to the single storage account in the resource group
$storageAccount = Get-AzResource -ResourceGroupName $temporaryResourceGroup.ResourceGroupName `
                                 -ResourceType      "Microsoft.Storage/storageAccounts";


# find the "packerlogs" container
$storageKey = ($storageAccount | Get-AzStorageAccountKey)[0].Value
$context = New-AzStorageContext -StorageAccountName $storageAccount.Name -StorageAccountKey $storageKey
$packerlogs = Get-AzStorageContainer -Context $context -Name "packerlogs";


# get the list of blobs that represent the customization logs from each of the individual template builds
$blobs = Get-AzStorageBlob -Context $context -Container $packerlogs.Name -Blob "*/customization.log";


# but which blob do I want for $myImageVersion?

最后,我现在每次使用它来构建新的图像版本时都会删除并重新创建图像模板。

这会导致临时资源组被删除并重新创建,因此在构建过程结束时,packerlogs 容器下只有一个文件夹。

结果是 Get-AzStorageBlob -Context $context -Container $packerlogs.Name -Blob "*/customization.log" 只有 returns 一个 blob,我可以安全地(?)假设那是我构建的那个。

这似乎是一种信仰的飞跃,但我看不到任何其他可靠的方法来将构建实例关联到加壳日志容器下的相关文件夹,所以现在必须这样做...