Создание виртуальной машины Windows в Конструкторе образов виртуальных машин с помощью PowerShell

Область применения: ✔️ Виртуальные машины Windows

В этой статье показано, как создать настраиваемый образ виртуальной машины Windows с помощью модуля PowerShell Конструктора образов виртуальных машин Azure.

Необходимые компоненты

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Если вы решили использовать PowerShell локально, для работы с этой статьей установите модуль Azure PowerShell и подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount. Дополнительные сведения см. в статье Установка Azure PowerShell.

Для некоторых шагов требуются командлеты из модуля Az.ImageBuilder . Установите отдельно с помощью следующей команды.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Вариант Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Screenshot that shows an example of Try It for Azure Cloud Shell.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Button to launch Azure Cloud Shell.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.

  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.

  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.

  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

Если вы используете несколько подписок Azure, выберите ту, за ресурсы в которой будут выставляться счета. Выберите нужную подписку с помощью командлета Set-AzContext.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Регистрация поставщиков

При необходимости зарегистрируйте следующие поставщики ресурсов для использования с подпиской Azure:

  • Microsoft.Compute;
  • Microsoft.KeyVault
  • Microsoft.Storage;
  • Microsoft.Network.
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Определение переменных

Поскольку вы будете использовать несколько фрагментов информации повторно, необходимо создать переменные для их хранения:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Создайте переменную для идентификатора подписки Azure. Чтобы убедиться, что переменная subscriptionID содержит ваш идентификатор подписки, можно выполнить вторую строку в следующем примере.

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Создание или изменение группы ресурсов

Создайте группу ресурсов Azure с помощью командлета New-AzResourceGroup. Группа ресурсов — это логический контейнер, в котором ресурсы Azure развертываются и администрируются как группа.

В следующем примере создается группа ресурсов на основе имени в переменной $imageResourceGroup в регионе, указанном в переменной $location. Эта группа ресурсов используется для хранения артефакта шаблона конфигурации образа и самого образа.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Создание удостоверения пользователя и настройка разрешений роли

Предоставьте Конструктору образов виртуальных машин Azure разрешения для создания образов в указанной группе ресурсов, используя следующий пример. Без этого разрешения процесс сборки образов не будет завершен успешно.

  1. Создайте переменные для имен определения роли и удостоверения. Эти значения должны быть уникальными.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Создайте удостоверение пользователя.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Сохраните идентификаторы ресурса удостоверения и субъекта в переменных.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

Назначение разрешений для удостоверения для распространения образов

  1. Скачайте файл конфигурации JSON и измените его на основе параметров, как описано в этой статье.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. Создайте определение роли.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Предоставьте определение роли для субъекта-службы Конструктора образов виртуальных машин.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

Примечание.

В случае отображения ошибки: "New-AzRoleDefinition. Предел определения роли превышен. Невозможно создать дополнительные определения.", см. статью Устранение неполадок с Azure RBAC (управление доступом на основе ролей).

  1. Создайте коллекцию.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Создайте определение коллекции.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Создание образа

  1. Создайте исходный объект Конструктора образов виртуальных машин. Допустимые значения параметров см. в статье Поиск образов виртуальных машин в Azure Marketplace с помощью Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Создайте объект распространителя Конструктора образов виртуальных машин.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Создайте объект настройки Конструктора образов виртуальных машин.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Создайте второй объект настройки Конструктора образов виртуальных машин.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Создайте шаблон Конструктора образов виртуальных машин.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

После создания шаблона возвращается сообщение и создается шаблон конфигурации Конструктора образов виртуальных машин в $imageResourceGroup.

Чтобы определить успешность создания шаблона, используйте следующий пример.

Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
  Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState

В фоновом режиме Конструктор образов виртуальных машин также создаст в вашей подписке промежуточную группу ресурсов. Эта группа ресурсов используется для сборки образа. Формат — IT_<DestinationResourceGroup>_<TemplateName>.

Предупреждение

Не удаляйте промежуточную группу ресурсов напрямую. Чтобы удалить промежуточную группу ресурсов, удалите артефакт шаблона образа.

Если служба сообщает об ошибке при отправке шаблона конфигурации образа, выполните следующие действия:

Запустите сборку образа

Отправьте конфигурацию образа в службу Конструктора образов виртуальных машин, выполнив следующую команду:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Дождитесь завершения процесса создания образа, что может занять до часа.

При возникновении ошибок см. статью Устранение неполадок с Конструктором образов виртуальных машин Azure.

создание виртуальной машины;

  1. Сохраните учетные данные входа для виртуальной машины в переменной. Пароль должен быть сложным.

    $Cred = Get-Credential
    
  2. Создайте виртуальную машину с помощью созданного вами образа.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Проверка внесенных изменений

  1. Подключитесь к виртуальной машине через удаленный рабочий стол, используя имя пользователя и пароль, заданные при создании виртуальной машины.

  2. В виртуальной машине откройте PowerShell и выполните Get-Content, как показано в следующем примере.

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    Выходные данные основаны на содержимом файла, созданного в процессе настройки образа.

    Azure-Image-Builder-Was-Here
    
  3. В том же сеансе PowerShell проверьте, успешно ли выполнена вторая настройка. Для этого проверьте наличие файла c:\buildArtifacts\index.html, как показано в следующем примере.

    Get-ChildItem c:\buildArtifacts\
    

    Результатом должен быть список содержимого каталога, в котором присутствует файл, скачанный в процессе настройки образа.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

Очистка ресурсов

Если вам больше не нужны ресурсы, созданные во время этого процесса, их можно удалить следующим образом:

  1. Удалите шаблон Конструктора образов виртуальных машин.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Удалите группу ресурсов образа.

    Внимание

    В следующем примере показано, как удалить указанную группу ресурсов и все содержащиеся в ней ресурсы. Если в указанной группе ресурсов существуют другие ресурсы, кроме созданных для этой статьи, они также будут удалены.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Следующие шаги

Дополнительные сведения о компонентах файла JSON, используемых в этой статье, см. в статье Справочник по шаблонам Конструктора образов виртуальных машин.