使用 Azure VM 映像生成器创建 Windows VM
适用于:✔️ Windows VM
本文介绍如何使用 Azure VM 映像生成器创建自定义 Windows 映像。 本文中的示例使用自定义程序来自定义映像:
- PowerShell (ScriptUri):下载并运行 PowerShell 脚本。
- Windows 重启:重启 VM。
- PowerShell(内联):运行特定的命令。 本示例通过使用
mkdir c:\\buildActions
在 VM 上创建一个目录。 - 文件:将 GitHub 中的文件复制到 VM。 本示例将 index.md 复制到 VM 上的
c:\buildArtifacts\index.html
中。 buildTimeoutInMinutes
:指定生成时间(以分钟为单位)。 默认值为 240 分钟,可增加该值使长时间运行的生成能够完成。 允许的最小值为 6 分钟。 小于 6 分钟的值将导致错误。vmProfile
:指定vmSize
和网络属性。osDiskSizeGB
:可用于增大映像的大小。identity
。 提供 VM 映像生成器在生成期间使用的标识。
使用以下示例 JSON 模板配置映像:helloImageTemplateWin.json。
注册提供程序
若要使用 VM 映像生成器,则需要注册此功能。 运行以下命令来检查注册:
az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState
如果输出未显示“已注册”,请运行以下命令:
az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance
设置变量
因为你将重复使用某些信息,所以要创建一些变量来存储这些信息:
# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='ChinaNorth3'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'
为你的订阅 ID 创建变量:
subscriptionID=$(az account show --query id --output tsv)
创建资源组
若要存储映像配置模板项目和映像,请使用以下资源组:
az group create -n $imageResourceGroup -l $location
创建用户分配的标识,并在资源组上设置权限
VM 映像生成器使用提供的用户标识将映像注入到资源组中。 在此示例中将创建一个 Azure 角色定义,该定义具有分发映像的特定权限。 然后将角色定义分配给用户标识。
创建一个用户分配的托管标识并授予权限
创建一个用户分配的标识,以便 VM 映像生成器可以访问存储脚本的存储帐户。
identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName
# Get the identity ID
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)
# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName
# Download the preconfigured role definition example
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json
imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')
# Update the definition
sed -i -e "s%<subscriptionID>%$subscriptionID%g" aibRoleImageCreation.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" aibRoleImageCreation.json
sed -i -e "s%Azure Image Builder Service Image Creation Role%$imageRoleDefName%g" aibRoleImageCreation.json
# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json
# Grant a role definition to the user-assigned identity
az role assignment create \
--assignee $imgBuilderCliId \
--role "$imageRoleDefName" \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
下载映像配置模板
我们已经创建了一个参数化映像配置模板供你试用。 请下载示例 JSON 文件,然后使用先前设置的变量对其进行配置。
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json
sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json
可以使用 vi
等文本编辑器在终端中修改此示例。
vi helloImageTemplateWin.json
创建映像
通过运行以下命令,将映像配置提交到 VM 映像生成器服务:
az resource create \
--resource-group $imageResourceGroup \
--properties @helloImageTemplateWin.json \
--is-full-object \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n helloImageTemplateWin01
完成后,会将成功消息返回到控制台,并在 $imageResourceGroup
中创建 VM 映像生成器配置模板。
在后台,VM 映像生成器还会在你的订阅中创建一个暂存资源组。 此资源组用于按以下格式生成映像:IT_<DestinationResourceGroup>_<TemplateName>
。
注意
如果需要删除,请不要直接删除暂存资源组。 首先,请删除映像模板工件,系统随后会删除暂存资源组。 否则,映像模板可能会进入失败状态。
如果服务在提交映像配置模板时报告失败,请执行以下操作:
- 请参阅排查 Azure VM 映像生成器服务的问题。
- 尝试重新提交模板前,请运行以下命令将其删除:
az resource delete \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n helloImageTemplateWin01
启动映像生成
使用 az resource invoke-action 启动映像生成过程。
az resource invoke-action \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n helloImageTemplateWin01 \
--action Run
等待生成完成。
如果遇到任何错误,请参阅排查 Azure VM 映像生成器服务的问题。
创建 VM
使用已生成的映像创建 VM。 在以下代码中,将密码替换为 VM 上用于 aibuser 的你自己的密码。<>
az vm create \
--resource-group $imageResourceGroup \
--name aibImgWinVm00 \
--admin-username aibuser \
--admin-password <password> \
--image $imageName \
--location $location
验证自定义
使用创建 VM 时设置的用户名和密码创建与 VM 的远程桌面连接。 在 VM 中,打开命令提示符窗口,然后键入:
dir c:\
在映像自定义期间会创建以下两个目录:
- buildActions
- buildArtifacts
清理资源
完成后,请删除已创建的资源。
删除 VM 映像生成器模板。
az resource delete \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateWin01
删除角色分配、角色定义和用户标识。
az role assignment delete \ --assignee $imgBuilderCliId \ --role "$imageRoleDefName" \ --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup az role definition delete --name "$imageRoleDefName" az identity delete --ids $imgBuilderId
删除映像资源组。
az group delete -n $imageResourceGroup
后续步骤
若要详细了解本文中使用的 JSON 文件的组件,请参阅 Azure VM 映像生成器模板参考。