你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

配置容器映像以使用 Terraform 执行部署

本文介绍如何生成自定义 Terraform 容器映像,以在 Azure 部署环境 (ADE) 中部署环境定义。 了解如何配置自定义映像以使用 Terraform 基础结构即代码 (IaC) 框架来预配基础结构。

环境定义至少包含两个文件:模板文件(如 main.tf)和名为 environment.yaml 的清单文件。 使用容器部署使用 Terraform 的环境定义。

ADE 扩展性模型让你能够创建自定义容器映像以用于环境定义。 通过使用扩展性模型,你可以创建自己的自定义容器映像,并将其存储在容器注册表中,例如 DockerHub。 然后,可以在环境定义中引用这些映像来部署环境。

ADE CLI 是一款工具,允许你使用 ADE 基础映像生成自定义映像。 可以使用 ADE CLI 自定义部署和删除,以适应你的工作流。 ADE CLI 预安装在示例映像上。 若要详细了解 ADE CLI,请参阅 CLI 自定义运行程序映像参考

先决条件

使用 Terraform 创建和生成 Docker 映像

本示例介绍如何生成 Docker 映像来利用 ADE 部署并访问 ADE CLI,使你的映像基于 ADE 创作的映像之一。

若要生成为 ADE 配置的映像,请执行以下步骤:

  1. 使用 FROM 语句,以 ADE 撰写的示例映像或所选映像为基础制作映像。
  2. 使用 RUN 语句安装映像所需的任何包。
  3. 在 Dockerfile 所在的同一级别创建脚本文件夹,将 deploy.shdelete.sh 文件存储在其中,并确保这些脚本在创建的容器中可发现和可执行。 部署必须使用 ADE 核心映像执行此步骤。
  4. 生成映像,将其推送到容器注册表,并确保 ADE 可以访问该映像。
  5. 在环境定义的 runner 属性中引用映像。

使用 FROM 语句选择示例容器映像

在创建的 DockerFile 中包括一个 FROM 语句,使新映像指向 Microsoft 工件注册表上托管的示例映像。

下面是引用示例核心映像的示例 FROM 语句:

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

此语句拉取最近发布的核心映像,并使其成为你的自定义映像的基础。

在 Dockerfile 中安装 Terraform

可以将 Terraform CLI 安装到可执行文件位置,以便在部署和删除脚本中使用它。

下面是安装 Terraform CLI 版本 1.7.5 的过程示例:

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

提示

可以从 Hashicorp 版本获取你想要的 Terraform CLI 版本的下载 URL。

ADE 示例映像基于 Azure CLI 映像,并且预安装了 ADE CLI 和 JQ 包。 可以详细了解 Azure CLIJQ 包

若要在映像中安装所需的任何其他包,请使用 RUN 语句。

执行操作 shell 脚本

在示例映像中,将根据操作名称来确定和执行操作。 目前,支持的两个操作名称是 deploy 和 delete

若要设置自定义映像以利用此结构,请在名为 scripts 的 Dockerfile 级别指定一个文件夹,然后指定两个文件 deploy.sh 和 delete.sh。deploy shell 脚本在创建或重新部署环境时运行,delete shell 脚本在删除环境时运行。 可以在存储库中 ARM-Bicep 映像的 Runner-Images 文件夹下查看 shell 脚本的示例。

若要确保这些 shell 脚本是可执行的,请将以下行添加到 Dockerfile:

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

创作操作 shell 脚本以使用 Terraform CLI

通过 Terraform 部署基础结构分为三个步骤:

  1. terraform init - 初始化 Terraform CLI 以在工作目录中执行操作
  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 的权限在订阅中部署基础结构,则在使用 Terraform AzureRM 提供程序预配基础结构时,脚本需要使用托管服务标识 (MSI)。 如果你的部署需要特殊权限才能完成部署(例如特定角色),请将这些权限分配给用于环境部署的项目环境类型的标识。 ADE 设置相关的环境变量,例如核心映像入口点内的客户端、租户和订阅 ID,因此请运行以下命令以确保提供程序使用 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 设置环境变量Azure 部署环境 CLI 变量参考中提供了提供的 ADE 环境变量的列表。 这些命令的示例如下:

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 CLI,生成基础结构预配计划,并在部署脚本期间应用计划:

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 访问环境时上传并访问部署的输出,请通过 JQ 包将输出对象从 Terraform 转换为 ADE 指定的格式。 设置 $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

生成映像

在生成要推送到注册表的映像之前,请确保计算机上已安装 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}

将映像连接到环境定义

创作环境定义以在其部署中使用自定义映像时,请编辑清单文件(environment.yaml 或 manifest.yaml)上的 runner 属性。

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

使用脚本生成容器映像

Microsoft 提供了一个快速入门脚本来帮助你入门。 该脚本生成映像并将其推送到存储库 ade 下的指定 Azure 容器注册表 (ACR) 和标记 latest

若要使用该脚本,必须:

  1. 配置 Dockerfile 和脚本文件夹以支持 ADE 扩展性模型。
  2. 为自定义映像提供注册表名称和目录。
  3. 安装 Azure CLI 和 Docker Desktop,并在 PATH 变量中进行安装。
  4. 有权推送到指定的注册表。

可以在此处运行脚本。

可以在 PowerShell 中使用以下命令调用脚本:

.\quickstart-image-build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}'

此外,如果要推送到特定的存储库和标记名称,可以运行:

.\quickstart-image.build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}' -Repository '{YOUR_REPOSITORY}' -Tag '{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 检索环境的最新操作,然后查看该操作 ID 的日志。

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