Поделиться через


Настройка образа контейнера для выполнения развертываний с помощью Terraform

В этой статье вы узнаете, как создавать пользовательские образы контейнеров Terraform для развертывания определений среды в средах развертывания Azure (ADE). Вы узнаете, как настроить пользовательский образ для подготовки инфраструктуры с помощью платформы Terraform Infrastructure-as-Code (IaC).

Определение среды состоит по крайней мере из двух файлов: файла шаблона, например main.tf, и файла манифеста с именем environment.yaml. Контейнер используется для развертывания определения среды, использующего Terraform.

Модель расширяемости ADE позволяет создавать пользовательские образы контейнеров для использования с определениями среды. Используя модель расширяемости, вы можете создавать собственные пользовательские образы контейнеров и хранить их в реестре контейнеров, например DockerHub. Затем вы можете ссылаться на эти образы в определениях среды для развертывания сред.

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

Создание пользовательского образа контейнера Terraform

Создание пользовательского образа контейнера позволяет настроить развертывания в соответствии с вашими требованиями.

После завершения настройки образа необходимо создать образ и отправить его в реестр контейнеров.

Создание и настройка образа контейнера с помощью Docker

В этом примере вы узнаете, как создать образ Docker для использования развертываний ADE и доступа к интерфейсу командной строки ADE, базируя образ на одном из созданных образов ADE.

Интерфейс командной строки ADE — это средство, позволяющее создавать пользовательские образы с помощью базовых образов ADE. Вы можете использовать интерфейс командной строки ADE для настройки развертываний и удалений в соответствии с рабочим процессом. Интерфейс командной строки ADE предварительно установлен на примерах изображений. Дополнительные сведения о интерфейсе командной строки ADE см. в справочнике по пользовательскому образу запуска интерфейса командной строки.

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

  1. Создайте образ на созданном ADE образе или на выбранном изображении с помощью инструкции FROM.
  2. Установите все необходимые пакеты для образа с помощью инструкции RUN.
  3. Создайте папку скриптов на том же уровне, что и Dockerfile, сохраните deploy.sh и delete.sh файлы в нем и убедитесь, что эти скрипты доступны для обнаружения и исполняемого файла в созданном контейнере. Этот шаг необходим для развертывания с помощью основного образа ADE.

Выбор примера образа контейнера с помощью инструкции FROM

Добавьте инструкцию FROM в созданный Файл DockerFile для нового образа, указывающего на образ, размещенный на Реестр артефактов Microsoft.

Ниже приведен пример инструкции FROM, ссылающейся на образ ядра примера:

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

Эта инструкция извлекает последний опубликованный основной образ и делает его основой для пользовательского образа.

Установка Terraform в Dockerfile

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

Вот пример этого процесса, установка версии 1.7.5 интерфейса командной строки Terraform:

RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip
RUN unzip terraform.zip && rm terraform.zip
RUN mv terraform /usr/bin/terraform

Совет

Вы можете получить URL-адрес скачивания для предпочтительной версии интерфейса командной строки Terraform из выпусков Hashicorp.

Образы ADE основаны на образе Azure CLI и предварительно установлены пакеты ADE CLI и JQ. Дополнительные сведения о Azure CLI и пакете JQ можно узнать больше.

Чтобы установить все пакеты, необходимые в образе, используйте инструкцию RUN.

Выполнение скриптов оболочки операций

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

Чтобы настроить пользовательский образ для использования этой структуры, укажите папку на уровне именованных скриптов Dockerfile и укажите два файла, deploy.sh и delete.sh. Скрипт оболочки развертывания запускается при создании или повторном развертывании среды, а сценарий оболочки удаления запускается при удалении среды. Примеры скриптов оболочки можно просмотреть в репозитории в папке Runner-Images для образа ARM-Bicep .

Чтобы убедиться, что эти скрипты оболочки являются исполняемыми, добавьте в Dockerfile следующие строки:

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Создание скриптов оболочки операций для использования интерфейса командной строки Terraform

Существует три шага для развертывания инфраструктуры с помощью Terraform:

  1. terraform init — инициализирует интерфейс командной строки Terraform для выполнения действий в рабочем каталоге.
  2. terraform plan — разрабатывает план на основе входящих файлов инфраструктуры Terraform и переменных, а также всех существующих файлов состояния и разрабатывает шаги, необходимые для создания или обновления инфраструктуры, указанной в файлах .tf .
  3. terraform apply — применяет план для создания новой или обновления существующей инфраструктуры в Azure

Во время точки входа основного образа все существующие файлы состояния извлекаются в контейнер и каталог, сохраненный в переменной $ADE_STORAGEсреды. Кроме того, все параметры, заданные для текущей среды, хранящейся в переменной $ADE_OPERATION_PARAMETERS. Чтобы получить доступ к существующему файлу состояния и задать переменные в файле .tfvars.json , выполните следующие команды:

EnvironmentState="$ADE_STORAGE/environment.tfstate"
EnvironmentPlan="/environment.tfplan"
EnvironmentVars="/environment.tfvars.json"

echo "$ADE_OPERATION_PARAMETERS" > $EnvironmentVars

Кроме того, чтобы использовать привилегии ADE для развертывания инфраструктуры в подписке, скрипту необходимо использовать управляемое удостоверение службы (MSI) при подготовке инфраструктуры с помощью поставщика AzureRM Terraform. Если в развертывании требуются специальные разрешения для завершения развертывания, например для определенных ролей, назначьте эти разрешения удостоверениям типа среды проекта, используемым для развертывания среды. ADE задает соответствующие переменные среды, такие как идентификаторы клиента, клиента и подписки в точке входа основного образа, поэтому выполните следующие команды, чтобы убедиться, что поставщик использует ADE MSI:

export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID

Если в шаблоне есть другие переменные, которые не указаны в параметрах среды, задайте переменные среды с помощью префикса TF_VAR. Список предоставленных переменных среды ADE предоставляется справочник по переменным среды развертывания Azure. Примером этих команд может быть;

export TF_VAR_resource_group_name=$ADE_RESOURCE_GROUP_NAME
export TF_VAR_ade_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_ade_subscription=$ADE_SUBSCRIPTION_ID
export TF_VAR_ade_location=$ADE_ENVIRONMENT_LOCATION
export TF_VAR_ade_environment_type=$ADE_ENVIRONMENT_TYPE

Теперь можно выполнить шаги, перечисленные ранее для инициализации интерфейса командной строки Terraform, создания плана подготовки инфраструктуры и применения плана во время скрипта развертывания:

terraform init
terraform plan -no-color -compact-warnings -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

Во время скрипта удаления можно добавить destroy флаг в создание плана для удаления существующих ресурсов, как показано в следующем примере:

terraform init
terraform plan -no-color -compact-warnings -destroy -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

Наконец, чтобы сделать выходные данные развертывания отправленными и доступными при доступе к среде через Azure CLI, преобразуйте выходной объект из Terraform в указанный ADE формат через пакет JQ. Задайте значение переменной среды $ADE_OUTPUTS, как показано в следующем примере:

tfOutputs=$(terraform output -state=$EnvironmentState -json)
# Convert Terraform output format to ADE format.
tfOutputs=$(jq 'walk(if type == "object" then 
            if .type == "bool" then .type = "boolean" 
            elif .type == "list" then .type = "array" 
            elif .type == "map" then .type = "object" 
            elif .type == "set" then .type = "array" 
            elif (.type | type) == "array" then 
                if .type[0] == "tuple" then .type = "array" 
                elif .type[0] == "object" then .type = "object" 
                elif .type[0] == "set" then .type = "array" 
                else . 
                end 
            else . 
            end 
        else . 
        end)' <<< "$tfOutputs")

echo "{\"outputs\": $tfOutputs}" > $ADE_OUTPUTS

Сделать настраиваемый образ доступным для ADE

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

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

Прежде чем отправлять образ в реестр, убедитесь , что на компьютере установлен модуль Docker. Затем перейдите в каталог Dockerfile и выполните следующую команду:

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

Например, если вы хотите сохранить образ в репозитории в реестре с именем customImageи отправить с помощью версии тега 1.0.0, выполните следующие действия:

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Отправка образа Docker в реестр

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

Реестр контейнеров Azure — это предложение Azure, которое хранит образы контейнеров и аналогичные артефакты.

Чтобы создать реестр, который можно выполнить с помощью Azure CLI, портал Azure, команд PowerShell и многое другое, выполните одно из кратких руководств.

Чтобы настроить реестр для включения анонимного извлечения образа, выполните следующие команды в Azure CLI:

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

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

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Подключение изображение в определение среды

При создании определений среды для использования пользовательского образа в развертывании измените runner свойство в файле манифеста (environment.yaml или manifest.yaml).

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

Доступ к журналам операций и сведениям об ошибках

ADE сохраняет сведения об ошибке для неудачного развертывания в файле $ADE_ERROR_LOG в контейнере.

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

  1. Войдите на портал разработчика.

  2. Определите среду, которая не удалось развернуть, и выберите "Просмотреть сведения".

    Снимок экрана: сведения об ошибке развертывания с ошибкой, в частности недопустимое имя учетной записи хранения.

  3. Просмотрите сведения об ошибке в разделе сведений об ошибке.

    Снимок экрана: сбой развертывания среды с кнопкой

Кроме того, azure CLI можно использовать для просмотра сведений об ошибке среды с помощью следующей команды:

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

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

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}