你当前正在访问 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 自定义运行程序映像参考。
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 在 Azure 订阅中设置的 Azure 部署环境。
- 若要设置 ADE,请按照快速入门:配置 Azure 部署环境进行操作。
使用 Terraform 创建和生成 Docker 映像
本示例介绍如何生成 Docker 映像来利用 ADE 部署并访问 ADE CLI,使你的映像基于 ADE 创作的映像之一。
若要生成为 ADE 配置的映像,请执行以下步骤:
- 使用 FROM 语句,以 ADE 撰写的示例映像或所选映像为基础制作映像。
- 使用 RUN 语句安装映像所需的任何包。
- 在 Dockerfile 所在的同一级别创建脚本文件夹,将 deploy.sh 和 delete.sh 文件存储在其中,并确保这些脚本在创建的容器中可发现和可执行。 部署必须使用 ADE 核心映像执行此步骤。
- 生成映像,将其推送到容器注册表,并确保 ADE 可以访问该映像。
- 在环境定义的
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 CLI 和 JQ 包。
若要在映像中安装所需的任何其他包,请使用 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 部署基础结构分为三个步骤:
terraform init
- 初始化 Terraform CLI 以在工作目录中执行操作terraform plan
- 根据传入的 Terraform 基础结构文件和变量以及任何现有状态文件制定计划,并制定创建或更新 .tf 文件中指定的基础结构所需的步骤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
。
若要使用该脚本,必须:
- 配置 Dockerfile 和脚本文件夹以支持 ADE 扩展性模型。
- 为自定义映像提供注册表名称和目录。
- 安装 Azure CLI 和 Docker Desktop,并在 PATH 变量中进行安装。
- 有权推送到指定的注册表。
可以在此处运行脚本。
可以在 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 文件中。
排查部署失败的问题:
登录到开发人员门户。
确定部署失败的环境,然后选择“查看详细信息”。
在“错误详细信息”部分中查看“错误详细信息”。
此外,可以使用 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}
相关内容
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈