Создание образа и использование управляемого удостоверения, назначаемого пользователем, для доступа к файлам в учетной записи хранения Azure
Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы
Из этой статьи вы узнаете, как создать настраиваемый образ с помощью Конструктора образов виртуальных машин Azure. Служба использует управляемое удостоверение , назначаемое пользователем, для доступа к файлам в учетной записи хранения Azure и может обеспечить блокировку доступа к учетной записи хранения без проверки подлинности.
Конструктор образов виртуальных машин Azure поддерживает использование скриптов и копирование файлов из GitHub, учетных записей хранения Azure и других расположений. Если вы хотите использовать расположения, они должны быть внешне доступными для Конструктора образов виртуальных машин.
В приведенном ниже примере вы создадите две группы ресурсов, одна из которых будет использоваться для пользовательского образа, а другая будет размещать учетную запись хранения Azure, содержащую файл скрипта. Этот пример имитирует реальный сценарий, при котором вы можете иметь артефакты сборки или файлы образов в разных учетных записях хранения. Вы создадите назначаемое пользователем удостоверение, а затем предоставите удостоверению разрешения на чтение файла скрипта, но без разрешения общего доступа к файлу. Затем с помощью программы настройки оболочки вы сможете скачать и запустить этот скрипт из учетной записи хранения.
Создание или изменение группы ресурсов
Так как вы будете использовать несколько блоков информации повторно, необходимо создать переменные для их хранения.
# Image resource group name imageResourceGroup=aibmdimsi # Storage resource group strResourceGroup=aibmdimsistor # Location location=WestUS2 # Name of the image to be created imageName=aibCustLinuxImgMsi01 # Image distribution metadata reference name runOutputName=u1804ManImgMsiro
Создайте переменную для идентификатора подписки:
subscriptionID=$(az account show --query id --output tsv)
Создайте группы ресурсов для образа и хранилища скриптов:
# Create a resource group for the image template az group create -n $imageResourceGroup -l $location # Create a resource group for the script storage az group create -n $strResourceGroup -l $location
Создайте назначаемое пользователем удостоверение и задайте разрешения для группы ресурсов:
Для внедрения образа в группу ресурсов Конструктор образов использует предоставленное удостоверение пользователя. В этом примере вы создаете определение роли Azure с помощью специальных действий для распространения образа. Затем определение роли будет назначено удостоверению пользователя.
# Create a user-assigned identity for VM Image Builder to access the storage account where the script is located identityName=aibBuiUserId$(date +'%s') az identity create -g $imageResourceGroup -n $identityName # Get an identity ID imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv) # Get the user-identity URI, which is 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 # Update the definition sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json # Create role definitions az role definition create --role-definition ./aibRoleImageCreation.json # Grant the role definition to the user-assigned identity az role assignment create \ --assignee $imgBuilderCliId \ --role "Azure Image Builder Service Image Creation Role" \ --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
Создайте учетную запись хранения и скопируйте в нее пример скрипта из GitHub:
# Script storage account scriptStorageAcc=aibstorscript$(date +'%s') # Script container scriptStorageAccContainer=scriptscont$(date +'%s') # Script URL scriptUrl=https://$scriptStorageAcc.blob.core.windows.net/$scriptStorageAccContainer/customizeScript.sh # Create the storage account and blob in the resource group az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS az storage container create -n $scriptStorageAccContainer --fail-on-exist --account-name $scriptStorageAcc # Copy in an example script from the GitHub repo az storage blob copy start \ --destination-blob customizeScript.sh \ --destination-container $scriptStorageAccContainer \ --account-name $scriptStorageAcc \ --source-uri https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/customizeScript.sh
Предоставьте разрешение Конструктору образов виртуальных машин на создание ресурсов в группе ресурсов образа. Значением
--assignee
является идентификатор удостоверения пользователя.az role assignment create \ --assignee $imgBuilderCliId \ --role "Storage Blob Data Reader" \ --scope /subscriptions/$subscriptionID/resourceGroups/$strResourceGroup/providers/Microsoft.Storage/storageAccounts/$scriptStorageAcc/blobServices/default/containers/$scriptStorageAccContainer
Изменение примера
Скачайте пример в формате JSON и настройте его с помощью созданных ранее переменных.
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/7_Creating_Custom_Image_using_MSI_to_Access_Storage/helloImageTemplateMsi.json -o helloImageTemplateMsi.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateMsi.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" helloImageTemplateMsi.json
sed -i -e "s/<region>/$location/g" helloImageTemplateMsi.json
sed -i -e "s/<imageName>/$imageName/g" helloImageTemplateMsi.json
sed -i -e "s%<scriptUrl>%$scriptUrl%g" helloImageTemplateMsi.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateMsi.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateMsi.json
Создание образа
Отправьте конфигурацию образа в службу "Конструктор образов виртуальных машин":
az resource create \ --resource-group $imageResourceGroup \ --properties @helloImageTemplateMsi.json \ --is-full-object \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01
Запустите сборку образа:
az resource invoke-action \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01 \ --action Run
На сборку может потребоваться около 15 минут.
создание виртуальной машины;
Создайте виртуальную машину на основе образа:
az vm create \ --resource-group $imageResourceGroup \ --name aibImgVm00 \ --admin-username aibuser \ --image $imageName \ --location $location \ --generate-ssh-keys
После создания виртуальной машины запустите сеанс SSH с ней.
ssh aibuser@<publicIp>
Как только ваше SSH-подключение будет установлено, вы должны получить "сообщение дня" с уведомлением о том, что образ настроен:
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
Очистка ресурсов
Если вам больше не нужны ресурсы, созданные во время этого процесса, их можно удалить с помощью следующего кода:
az role definition delete --name "$imageRoleDefName"
```azurecli-interactive
az role assignment delete \
--assignee $imgBuilderCliId \
--role "$imageRoleDefName" \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az identity delete --ids $imgBuilderId
az resource delete \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n helloImageTemplateMsi01
az group delete -n $imageResourceGroup
az group delete -n $strResourceGroup
Следующие шаги
Если у вас возникли проблемы при использовании Конструктора образов виртуальных машин, см. руководство по устранению неполадок Конструктора образов виртуальных машин Azure.