使用適用於 Linux VM 的 Azure VM Image Builder 來存取現有的 Azure 虛擬網路
適用於:✔️ Linux VM ✔️ 彈性擴展集
本文說明如何使用 Azure VM Image Builder 來建立能存取虛擬網路上現有資源的基本自訂 Linux 映像。 您所建立的組建虛擬機器 (VM) 會部署到您在訂閱中指定的新或現有虛擬網路。 當您使用現有的 Azure 虛擬網路時,VM Image Builder 不需要公用網路連線。
必要條件
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
設定變數和授權
針對這項工作,您會重複使用一些資訊。 建立一些變數來儲存該資訊。
# set your environment variables here!!!!
# destination image resource group
imageResourceGroup=aibImageRG01
# location (see possible locations in main docs)
location=WestUS2
# your subscription
# get the current subID : 'az account show | grep id'
subscriptionID=$(az account show --query id --output tsv)
# name of the image to be created
imageName=aibCustomLinuxImg01
# image distribution metadata reference name
runOutputName=aibCustLinManImg01ro
# VNET properties (update to match your existing VNET, or leave as-is for demo)
# VNET name
vnetName=myexistingvnet01
# subnet name
subnetName=subnet01
# VNET resource group name
# NOTE! The VNET must always be in the same region as the Azure Image Builder service region.
vnetRgName=existingVnetRG
# Existing Subnet NSG Name or the demo will create it
nsgName=aibdemoNsg
建立資源群組。
az group create -n $imageResourceGroup -l $location
設定網路
如果您沒有現有的虛擬網路、子網路或網路安全性群組 (NSG),請使用下列指令碼來建立。
# Create a resource group
az group create -n $vnetRgName -l $location
# Create VNET
az network vnet create \
--resource-group $vnetRgName \
--name $vnetName --address-prefix 10.0.0.0/16 \
--subnet-name $subnetName --subnet-prefix 10.0.0.0/24
# Create base NSG to simulate an existing NSG
az network nsg create -g $vnetRgName -n $nsgName
az network vnet subnet update \
--resource-group $vnetRgName \
--vnet-name $vnetName \
--name $subnetName \
--network-security-group $nsgName
# NOTE! The virtual network must always be in the same region as the Azure Image Builder service region.
新增 NSG 規則
此規則可讓 VM Image Builder 負載平衡器連線到 Proxy VM。 連接埠 60001 適用於 Linux,而連接埠 60000 適用於 Windows。 Proxy VM 在 Linux 中會利用連接埠 22 連線到組建 VM,在 Windows 中則會利用連接埠 5986 來連線。
az network nsg rule create \
--resource-group $vnetRgName \
--nsg-name $nsgName \
-n AzureImageBuilderNsgRule \
--priority 400 \
--source-address-prefixes AzureLoadBalancer \
--destination-address-prefixes VirtualNetwork \
--destination-port-ranges 60000-60001 --direction inbound \
--access Allow --protocol Tcp \
--description "Allow Image Builder Private Link Access to Proxy VM"
停用子網路上的私人服務原則
方法如下:
az network vnet subnet update \
--name $subnetName \
--resource-group $vnetRgName \
--vnet-name $vnetName \
--disable-private-link-service-network-policies true
如需詳細資訊,請參閱 Azure VM Image Builder 網路功能選項。
修改範例範本並建立角色
設定網路之後,您可以修改範例範本並建立角色。 方法如下:
# download the example and configure it with your vars
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1a_Creating_a_Custom_Linux_Image_on_Existing_VNET/existingVNETLinux.json -o existingVNETLinux.json
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleNetworking.json -o aibRoleNetworking.json
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" existingVNETLinux.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" existingVNETLinux.json
sed -i -e "s/<region>/$location/g" existingVNETLinux.json
sed -i -e "s/<imageName>/$imageName/g" existingVNETLinux.json
sed -i -e "s/<runOutputName>/$runOutputName/g" existingVNETLinux.json
sed -i -e "s/<vnetName>/$vnetName/g" existingVNETLinux.json
sed -i -e "s/<subnetName>/$subnetName/g" existingVNETLinux.json
sed -i -e "s/<vnetRgName>/$vnetRgName/g" existingVNETLinux.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleNetworking.json
sed -i -e "s/<vnetRgName>/$vnetRgName/g" aibRoleNetworking.json
設定資源群組的存取權限
VM Image Builder 會使用所提供的使用者身分識別,將映像插入 Azure Compute Gallery。 在此範例中,您會建立可將映像散佈至資源庫的 Azure 角色定義。 然後此將角色定義指派給使用者身分識別。
# create user assigned identity for image builder
identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName
# get identity id
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)
# get the user identity URI, needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName
# update the template
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" existingVNETLinux.json
# make role name unique, to avoid clashes in the same Azure Active Directory domain
imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')
netRoleDefName="Azure Image Builder Network Def"$(date +'%s')
# update the definitions
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Networking Role/$netRoleDefName/g" aibRoleNetworking.json
您可以建立兩個角色,而非授與 VM Image Builder 較低的細微性和較高的權限。 其中一個角色提供建立器建立映像的權限,另一個可讓其將組建 VM 和負載平衡器連線到您的虛擬網路。
# create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json
az role definition create --role-definition ./aibRoleNetworking.json
# grant role definition to the user assigned identity
az role assignment create \
--assignee $imgBuilderCliId \
--role "$imageRoleDefName" \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az role assignment create \
--assignee $imgBuilderCliId \
--role "$netRoleDefName" \
--scope /subscriptions/$subscriptionID/resourceGroups/$vnetRgName
如需詳細資訊,請參閱使用 Azure CLI 設定 Azure VM Image Builder 權限或使用 PowerShell 設定 Azure VM Image Builder 權限。
建立映像
將映像組態提交至 VM Image Builder。
az resource create \
--resource-group $imageResourceGroup \
--properties @existingVNETLinux.json \
--is-full-object \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n existingVNETLinuxTemplate01
# Wait approximately 1-3 mins (validation, permissions etc.)
啟動映像建置。
az resource invoke-action \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n existingVNETLinuxTemplate01 \
--action Run
# Wait approximately 15 mins
建立映像並複寫至這兩個區域可能需要一些時間。 請等候此部分完成,再繼續建立 VM。
建立 VM
根據 VM Image Builder 所建立的映像版本建立 VM。
az vm create \
--resource-group $imageResourceGroup \
--name aibImgVm0001 \
--admin-username aibuser \
--image $imageName \
--location $location \
--generate-ssh-keys
使用安全殼層 (SSH) 來進入 VM。
ssh aibuser@<publicIpAddress>
當您建立 SSH 連線時,您應該會看到映像是以當天的訊息進行自訂!
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
清除資源
如果您想要重新自訂映像版本以建立相同映像的新版本,請略過後續步驟並移至使用 Azure VM Image Builder 建立另一個映像版本。
接下來的步驟會刪除已建立的映像,以及所有其他資源檔。 在刪除資源前,請先確定您已完成此部署。
當您刪除資源庫的資源時,您必須先刪除所有映像版本,才能刪除用來建立它們的映像定義。 若要刪除資源庫,您必須先刪除資源庫中的所有映像定義。
刪除 VM Image Builder 範本:
az resource delete \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n existingVNETLinuxTemplate01
刪除授權指派、角色和身分識別:
az role assignment delete \
--assignee $imgBuilderCliId \
--role $imageRoleDefName \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az role assignment delete \
--assignee $imgBuilderCliId \
--role $netRoleDefName \
--scope /subscriptions/$subscriptionID/resourceGroups/$vnetRgName
az role definition delete --name "$imageRoleDefName"
az role definition delete --name "$netRoleDefName"
az identity delete --ids $imgBuilderId
刪除資源群組:
az group delete -n $imageResourceGroup
如果您為此快速入門建立了虛擬網路,則可以刪除不再使用的虛擬網路。