Задача DevOps Конструктора образов виртуальных машин Azure (предварительная версия)

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

В этой статье описывается, как использовать задачу Azure DevOps для внедрения артефактов сборки в образ виртуальной машины с целью установки и настройки приложения и ОС.

Важно!

Задача Azure DevOps для построителя образов виртуальных машин сейчас доступна в предварительной версии. Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.

Версии задач DevOps

В настоящее время в Конструкторе образов виртуальных машин Azure доступны задачи DevOps двух типов:

Предварительные требования

Примечание.

Задача Конструктора образов виртуальных машин в настоящее время не поддерживает перезапуск Windows или выполнение команд с повышенными привилегиями от имени администратора. То есть задача не подходит для сценариев Виртуального рабочего стола Azure или настроек Windows, требующих этих функций. Если вы хотите использовать DevOps с Конструктором образов виртуальных машин, вложите шаблон в задачу Azure Resource Manager, используя задачи Azure CLI или PowerShell.

Предварительно необходимо выполнить следующее.

  • Установите стабильную задачу DevOps из Visual Studio Marketplace.

  • У вас есть учетная запись Azure DevOps Services (ранее Visual Studio Team Services, VSTS) и созданный конвейер сборки.

  • Зарегистрируйте и включите требования к функциям Конструктора образов виртуальных машин в подписке, используемой конвейерами:

  • Создайте стандартную учетную запись хранения Azure в группе ресурсов исходного образа. Вы можете использовать другие группы ресурсов или учетные записи хранения. Учетная запись хранения используется для перемещения артефактов сборки из задачи DevOps в образ.

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

Добавление задачи в конвейер выпуска

  1. Выберите Конвейер выпуска>Изменить.

  2. В агенте пользователя выберите знак плюса (+), чтобы добавить и найти Конструктор образов.

  3. Выберите Добавить.

В следующих разделах вы зададите свойства задачи.

Подписка Azure.

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

Группа ресурсов

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

Location

Расположение — это регион, в котором будет выполняться Конструктор образов виртуальных машин. Поддерживается только заданное количество регионов. Исходные образы должны быть в этом расположении. Например, если вы используете Коллекцию вычислений Azure (ранее Общая коллекция образов), в этом регионе должна присутствовать реплика.

Управляемое удостоверение (обязательно)

Конструктору образов виртуальных машин требуется управляемое удостоверение, которое используется для считывания исходных пользовательских образов, подключения к службе хранилища Azure и создания пользовательских образов. Дополнительные сведения см. в разделе Разрешения.

Поддержка виртуальной сети

Созданную виртуальную машину можно настроить в определенной виртуальной сети. При настройке задачи укажите идентификатор ресурса существующей подсети в поле ввода Конфигурация виртуальной сети (необязательно). Не указывайте его, если вам не требуется использовать определенную виртуальную сеть. Дополнительные сведения см. в статье Возможности работы с сетью в Конструкторе образов виртуальных машин Azure.

Оригинал

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

  • Управляемый образ: передайте идентификатор ресурса. Например:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Коллекция вычислений: передайте идентификатор ресурса для версии образа. Например:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    Если вам нужно получить последнюю версию Коллекции вычислений, используйте задачу Azure PowerShell или Azure CLI, чтобы получить ее и задать переменную DevOps. Используйте переменную в задаче DevOps Конструктора образов виртуальных машин. Дополнительные сведения см. в примерах на странице о получении идентификатора ресурса последней версии образа.

  • (Marketplace) Базовый образ: воспользуйтесь раскрывающимся списком популярных образов, который всегда основывается на последней версии поддерживаемых операционных систем.

    Если базового образа нет в списке, можно указать точный образ с помощью Publisher:Offer:Sku.

    (Необязательно) Версия базового образа: вы можете указать нужную версию образа. Версия по умолчанию — latest.

Настройка

В следующих разделах рассматриваются различные способы настройки задач.

Подготовлено

Изначально поддерживаются два средства для настройки — Shell и PowerShell. Поддерживается только встроенный вариант. Если вы хотите скачать скрипты, вы можете передать для этого внутренние команды.

Выберите PowerShell или Shell для своей ОС.

Задача обновления Windows

Только для Windows: эта задача выполняет обновление Windows в конце процесса настройки. Она также запускает необходимые перезагрузки.

Задача выполняет следующую конфигурацию обновления Windows:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

Она устанавливает важные и рекомендуемые обновления Windows, которые не являются предварительными версиями.

Выполнение перезагрузок

Задача DevOps в настоящее время не поддерживает перезагрузку сборок Windows. При попытке выполнить перезагрузку с помощью кода PowerShell сборка завершается ошибкой. Для перезагрузки сборок Linux код использовать можно.

Путь сборки

Эта задача позволяет внедрять артефакты выпуска сборки DevOps в образ. Для этого нужно настроить конвейер сборки. При настройке конвейера выпуска добавьте репозиторий артефактов сборки.

Screenshot showing how to add an artifact in the release pipeline.

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

Важно!

При добавлении артефакта репозитория может оказаться, что имя каталога начинается с символа подчеркивания (_). Подчеркивание может препятствовать работе встроенных команд. Обязательно используйте соответствующие кавычки в командах.

В следующем примере показано, как это работает.

Screenshot of a directory structure showing hierarchy.

  • В Windows: файлы сохраняются на диске C:. Создается каталог buildArtifacts, включающий каталог webapp.

  • Для Linux: файлы существуют в каталоге /tmp . Создается webapp каталог, который включает все файлы и каталоги. Так как это временный каталог, необходимо перенести файлы из него. В противном случае они будут удалены.

Скрипт встроенной настройки

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

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    Вы можете сослаться на несколько скриптов или добавить дополнительные команды. Например:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • В Linux: артефакты сборки помещаются в каталог /tmp. Но во многих ОС Linux при перезагрузке содержимое каталога /tmp удаляется. Если вы хотите, чтобы в образе были артефакты, нужно создать еще один каталог и скопировать их в него. Например:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    Если вы используете каталог /tmp, вы можете выполнить скрипт с помощью следующего кода:

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

Что происходит с артефактами сборки после сборки образа?

Примечание.

Конструктор образов виртуальных машин не удаляет артефакты сборки автоматически. Мы настоятельно рекомендуем всегда использовать код для удаления артефактов сборки.

  • В Windows: Конструктор образов виртуальных машин развертывает файлы в каталог C:\buildArtifacts. Так как каталог сохраняется, его необходимо удалить, запустив скрипт. Например:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force
    
  • В Linux: артефакты сборки помещаются в каталог /tmp. Но во многих ОС Linux при перезагрузке содержимое каталога /tmp удаляется. Мы рекомендуем использовать код для удаления содержимого и не ждать, что его удалит ОС. Например:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

Общая длина сборки образа

Общую длину в задаче конвейера DevOps пока изменить нельзя. Длина по умолчанию составляет 240 минут. Если вы хотите увеличить значение buildTimeoutInMinutes, можно использовать задачу Azure CLI в конвейере выпуска. Настройте задачу так, чтобы скопировать и отправить шаблон. Пример решения см. на странице об использовании переменных среды и параметров с Конструктором образов виртуальных машин или воспользуйтесь Azure PowerShell.

Storage account

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

При запуске сборки Конструктор образов виртуальных машин создает контейнер imagebuilder-vststask, в котором хранятся артефакты сборки из репозитория.

Примечание.

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

Распространение

Поддерживаются следующие три типа распространения.

Управляемый образ

  • Идентификатор ресурса:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Ячейки

Коллекция вычислений уже должна существовать.

  • Идентификатор ресурса:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • Регионы: список регионов, разделенных запятыми, например westus, eastus, centralus.

Виртуальный жесткий диск

Вы не можете передать в него какие-либо значения. Конструктор образов виртуальных машин выдает виртуальный жесткий диск (VHD) во временную группу ресурсов Конструктора образов виртуальных машин (IT_<DestinationResourceGroup>_<TemplateName>) в контейнере vhds. При запуске сборки выпуска Конструктор образов виртуальных машин выдает журналы. По завершении работы Конструктора образов виртуальных машин он выдает URL-адрес на VHD.

Необязательные параметры

Вы можете переопределить параметр Размер виртуальной машины, указав вместо значения по умолчанию Standard_D1_v2 нужный размер. Вам может потребоваться это, чтобы сократить общее время настройки. Или же вы можете создать образы, которые зависят от определенных размеров виртуальных машин, таких как GPU (графический процессор), HPC (высокопроизводительные вычисления) и т. д.

Принцип работы задачи

При создании выпуска задача создает контейнер в учетной записи хранения с именем imagebuilder-vststask. Она архивирует (сжимает) и отправляет артефакты сборки, а также и создает маркер SAS для ZIP-файла.

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

  • Скачивает ZIP-файл артефакта сборки и все соответствующие сценарии. Файлы сохраняются в учетной записи хранения во временной группе ресурсов Конструктора образов виртуальных машин — IT_<DestinationResourceGroup>_<TemplateName>.

  • Создает шаблон с префиксом t_ и десятизначным монотонным целым числом. Шаблон сохраняется в выбранной группе ресурсов и существует, пока в группе ресурсов присутствует связанная сборка.

Пример результата:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

При запуске сборки образа в журналах выпусков указывается состояние выполнения.

starting run template...

По завершении сборки образа отображаются выходные данные следующего вида:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

Шаблон образа и IT_<DestinationResourceGroup>_<TemplateName> удаляются.

Вы можете воспользоваться переменной Azure DevOps Services (ранее Visual Studio Team Services, VSTS) $(imageUri) в следующей задаче или просто взять значение и создать виртуальную машину.

Выходные переменные DevOps

Вот издатель, предложение, номер SKU и версия исходного образа Marketplace:

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

Ниже приведен универсальный код ресурса (URI) образа, который является идентификатором ресурса распределенного образа:

  • $(imageUri)

Вопросы и ответы

Можно ли использовать уже существующий шаблон образа, созданный вне DevOps?

В настоящее время нет.

Можно ли указать имя шаблона изображения?

№ Используется уникальное имя шаблона, которое затем удаляется.

Задача Конструктора образов виртуальных машин завершилась сбоем. Как устранить проблему?

В случае сбоя сборки задача DevOps не удаляет промежуточную группу ресурсов. Вы можете получить доступ к промежуточной группе ресурсов с журналом настройки сборки.

В журнале DevOps появится сообщение об ошибке для задачи Конструктора образов виртуальных машин с указанием расположения файла customization.log. Например:

Screenshot of an example DevOps task error that describes the failure and provides the location of the customization.log file.

Дополнительные сведения см. в статье Устранение неполадок службы Конструктора образов Azure.

После устранения проблемы вы можете удалить промежуточную группу ресурсов. Сначала удалите артефакт ресурса шаблона Конструктора образов виртуальных машин. Артефакт имеет префикс t_, и его можно найти в журнале сборки задачи DevOps:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

Артефакт ресурса шаблона Конструктора образов виртуальных машин находится в группе ресурсов, указанной в задаче изначально. Завершив устранение неполадок, удалите артефакт. При удалении через портал Azure в группе ресурсов выберите Показать скрытые типы, чтобы просмотреть артефакт.

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

Дополнительные сведения см. в статье Общие сведения о Конструкторе образов виртуальных машин Azure.