Używanie narzędzia Azure VM Image Builder dla maszyn wirtualnych z systemem Linux do uzyskiwania dostępu do istniejącej sieci wirtualnej platformy Azure

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux — elastyczne zestawy ✔️ skalowania

W tym artykule pokazano, jak za pomocą narzędzia Azure VM Image Builder utworzyć podstawowy, dostosowany obraz systemu Linux, który ma dostęp do istniejących zasobów w sieci wirtualnej. Utworzona maszyna wirtualna kompilacji jest wdrażana w nowej lub istniejącej sieci wirtualnej określonej w ramach subskrypcji. W przypadku korzystania z istniejącej sieci wirtualnej platformy Azure narzędzie VM Image Builder nie wymaga łączności z siecią publiczną.

Wymagania wstępne

Ustawianie zmiennych i uprawnień

W tym zadaniu wielokrotnie używasz niektórych informacji. Utwórz pewne zmienne do przechowywania tych informacji.

# 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

Utwórz grupę zasobów.

az group create -n $imageResourceGroup -l $location

Konfigurowanie sieci

Jeśli nie masz istniejącej sieci wirtualnej, podsieci ani sieciowej grupy zabezpieczeń, użyj następującego skryptu, aby go utworzyć.


# 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.

Dodawanie reguły sieciowej grupy zabezpieczeń

Ta reguła umożliwia łączność z modułu równoważenia obciążenia konstruktora obrazów maszyny wirtualnej z maszyną wirtualną serwera proxy. Port 60001 jest przeznaczony dla systemu Linux, a port 60000 jest przeznaczony dla systemu Windows. Maszyna wirtualna serwera proxy łączy się z maszyną wirtualną kompilacji przy użyciu portu 22 dla systemu Linux lub portu 5986 dla systemu Windows.

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"

Wyłączanie zasad usługi prywatnej w podsieci

Oto kroki tej procedury:

az network vnet subnet update \
  --name $subnetName \
  --resource-group $vnetRgName \
  --vnet-name $vnetName \
  --disable-private-link-service-network-policies true 

Aby uzyskać więcej informacji, zobacz Opcje sieciowe konstruktora obrazów maszyny wirtualnej platformy Azure.

Modyfikowanie przykładowego szablonu i tworzenie roli

Po skonfigurowaniu sieci można zmodyfikować przykładowy szablon i utworzyć rolę. Oto kroki tej procedury:

# 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

Ustawianie uprawnień w grupie zasobów

Konstruktor obrazów maszyny wirtualnej używa tożsamości użytkownika dostarczonej do wstrzykiwania obrazu do galerii obliczeń platformy Azure. W tym przykładzie utworzysz definicję roli platformy Azure, która może rozpowszechniać obraz w galerii. Definicja roli jest następnie przypisywana do tożsamości użytkownika.

# 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

Zamiast udzielać konstruktora obrazów maszyny wirtualnej niższego stopnia szczegółowości i zwiększonego poziomu uprawnień, można utworzyć dwie role. Jedna rola daje konstruktorowi uprawnienia do tworzenia obrazu, a druga umożliwia łączenie maszyny wirtualnej kompilacji i modułu równoważenia obciążenia z siecią wirtualną.

# 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

Aby uzyskać więcej informacji, zobacz Konfigurowanie uprawnień konstruktora obrazów maszyny wirtualnej platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure lub Konfigurowanie uprawnień konstruktora obrazów maszyny wirtualnej platformy Azure przy użyciu programu PowerShell.

Tworzenie obrazu

Prześlij konfigurację obrazu do konstruktora obrazów maszyny wirtualnej.

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.)

Uruchom kompilację obrazu.

az resource invoke-action \
     --resource-group $imageResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n existingVNETLinuxTemplate01 \
     --action Run 

# Wait approximately 15 mins

Utworzenie obrazu i zreplikowanie go do obu regionów może trochę potrwać. Przed przejściem do tworzenia maszyny wirtualnej zaczekaj na zakończenie tej części.

Tworzenie maszyny wirtualnej

Utwórz maszynę wirtualną na podstawie wersji obrazu utworzonej przez konstruktora obrazów maszyny wirtualnej.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgVm0001 \
  --admin-username aibuser \
  --image $imageName \
  --location $location \
  --generate-ssh-keys

Użyj protokołu Secure Shell (SSH), aby uzyskać dostęp do maszyny wirtualnej.

ssh aibuser@<publicIpAddress>

Po nawiązaniu połączenia SSH obraz powinien zostać dostosowany z komunikatem dnia .

*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

Czyszczenie zasobów

Jeśli chcesz ponownie utworzyć wersję obrazu, aby utworzyć nową wersję tego samego obrazu, pomiń następne kroki i przejdź do tematu Korzystanie z narzędzia Azure VM Image Builder w celu utworzenia innej wersji obrazu.

Poniższy kod usuwa utworzony obraz wraz ze wszystkimi innymi plikami zasobów. Przed usunięciem zasobów upewnij się, że to wdrożenie zostało ukończone.

Po usunięciu zasobów galerii należy usunąć wszystkie wersje obrazów, zanim będzie można usunąć definicję obrazu użytą do ich utworzenia. Aby usunąć galerię, musisz najpierw usunąć wszystkie definicje obrazów w galerii.

Usuń szablon konstruktora obrazów maszyny wirtualnej:

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n existingVNETLinuxTemplate01

Usuń przypisania uprawnień, role i tożsamość:

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

Usuń grupę zasobów:

az group delete -n $imageResourceGroup

Jeśli utworzono sieć wirtualną na potrzeby tego przewodnika Szybki start, możesz usunąć sieć wirtualną, jeśli nie jest już używana.

Następne kroki

Galerie obliczeniowe platformy Azure