如何配置Test Kitchen使用Azure共享映像库中的镜像?
刚好我之前也遇到过一模一样的问题,用image_urn和image_url都没法完美解决自定义黄金镜像的测试需求,后来发现kitchen-azurerm其实原生支持Azure共享映像库(SIG)的镜像,核心就是用image_id参数代替之前的选项,而且能自动拉取最新版本,完全解决你的痛点。
核心解决方案:使用image_id参数
kitchen-azurerm支持通过Azure资源ID直接引用共享映像库中的镜像定义,这个ID可以指向特定版本,也可以用latest自动获取最新版本,不需要手动维护VHD URL或者镜像版本号。
1. 获取共享映像库的镜像资源ID
你可以通过Azure Portal或者Azure CLI快速获取这个ID:
- Azure CLI命令:
az sig image-version show --resource-group <resource-group-name> --gallery-name <gallery-name> --gallery-image-definition <image-def-name> --gallery-image-version latest --query id -o tsv
这条命令会直接输出最新版本镜像的资源ID,格式大概是:/subscriptions/<订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.Compute/galleries/<映像库名>/images/<镜像定义名>/versions/latest
2. 在kitchen.yml中配置image_id
把这个ID放到你的platform配置里,替换掉原来的image_urn或者image_url。示例配置如下:
--- driver: name: azurerm subscription_id: "<你的订阅ID>" client_id: "<服务主体ID>" client_secret: "<服务主体密钥>" tenant_id: "<租户ID>" platforms: - name: golden-image-ubuntu2204 driver: location: eastus vm_size: Standard_D2s_v3 # 直接引用共享映像库的最新版本镜像 image_id: "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-sig-rg/providers/Microsoft.Compute/galleries/my-company-gallery/images/ubuntu2204-gold/versions/latest" - name: golden-image-win2022 driver: location: eastus vm_size: Standard_D2s_v3 # 指定特定版本的镜像(如果需要固定测试版本) image_id: "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-sig-rg/providers/Microsoft.Compute/galleries/my-company-gallery/images/win2022-gold/versions/2.0.0" suites: - name: default run_list: - recipe[your-cookbook::default] verifier: name: inspec
3. 权限注意事项
确保Test Kitchen使用的服务主体(也就是配置里的client_id对应的身份)拥有共享映像库所在资源组的Gallery Reader角色,或者至少有针对该映像库的Microsoft.Compute/galleries/images/versions/read权限,这样才能正常拉取镜像创建测试VM。
为什么这个方案比之前的更好?
- 不用再找VHD URL:直接通过资源ID引用,不需要关心镜像底层的存储细节
- 自动获取最新版本:用
versions/latest就能自动使用共享映像库中最新的黄金镜像,每次更新镜像后,不需要修改kitchen.yml - 支持特定版本测试:如果需要验证特定版本的黄金镜像,只需要把
latest换成对应的版本号即可
最后验证一下,运行kitchen create命令,Test Kitchen应该能成功从共享映像库拉取镜像并创建测试VM,之后你就可以正常执行kitchen converge和kitchen verify来测试你的Chef代码了。
内容的提问来源于stack exchange,提问作者codewario

