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

教程:使用 Azure CLI 在虚拟机规模集中安装应用程序

若要在规模集中的虚拟机 (VM) 实例上运行应用程序,首先需要安装应用程序组件和所需文件。 前一篇教程介绍了如何创建自定义 VM 映像并使用它来部署 VM 实例。 使用此自定义映像可以手动安装和配置应用程序。 也可以在部署每个 VM 实例之后,将应用程序自动安装到规模集,或者更新已在规模集中运行的应用程序。 本教程介绍如何执行下列操作:

  • 将应用程序自动安装到规模集
  • 使用 Azure 自定义脚本扩展
  • 更新规模集中运行的应用程序

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

先决条件

  • 本文需要 Azure CLI 2.0.29 或更高版本。 如果使用 Azure Cloud Shell,则最新版本已安装。

什么是 Azure 自定义脚本扩展?

自定义脚本扩展在 Azure VM 上下载和执行脚本。 此扩展适用于部署后配置、软件安装或其他任何配置/管理任务。 可以从 Azure 存储或 GitHub 下载脚本,或者在扩展运行时将脚本提供给 Azure 门户。

自定义脚本扩展与 Azure 资源管理器模板集成,也可以与 Azure CLI、Azure PowerShell、Azure 门户或 REST API 配合使用。 有关详细信息,请参阅自定义脚本扩展概述

若要通过 Azure CLI 使用自定义脚本扩展,请创建 JSON 文件,用于定义要包含的文件和要执行的命令。 这些 JSON 定义可以在规模集部署之间重复使用,以应用一致的应用程序安装。

创建自定义脚本扩展定义

若要查看自定义脚本扩展的运行方式,请创建一个可以安装 NGINX Web 服务器并输出规模集 VM 实例主机名的规模集。 以下自定义脚本扩展定义从 GitHub 下载示例脚本,安装所需的包,然后将 VM 实例主机名写入一个基本的 HTML 页面。

在当前 shell 中,创建名为“customConfig.json”的文件并粘贴下面的配置。 例如,在不处于本地计算机上的 Cloud Shell 中创建文件。 可使用任何想要使用的编辑器。 在本教程中,我们将使用 Vi。 在 Cloud Shell 中输入 vi。 将以下 JSON 粘贴到编辑器中,然后键入 :w customConfig.json

{
  "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"],
  "commandToExecute": './automate_nginx.sh'
}

注意

如果决定直接在下面的 --settings 参数中引用 JSON(而不是引用 customConfig.json 文件),则可能需要在 JSON 块内反转使用单引号 (') 和双引号 (") 。

创建规模集

重要

从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及应执行的操作,请转到针对 VMSS PowerShell/CLI 客户的中断性变更 - Microsoft 社区中心

使用 az group create 创建资源组。 以下示例在 eastus 位置创建名为 myResourceGroup 的资源组:

az group create --name myResourceGroup --location eastus

现在,使用 az vmss create 创建虚拟机规模集。 以下示例创建名为“myScaleSet”的规模集,并生成 SSH 密钥(如果不存在):

az vmss create \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --image Ubuntu2204 \
  --orchestration-mode Flexible \
  --admin-username azureuser \
  --generate-ssh-keys

创建和配置所有的规模集资源和 VM 需要几分钟时间。

应用自定义脚本扩展

使用 az vmss extension set 将自定义脚本扩展配置应用到规模集中的 VM 实例。 以下示例将 customConfig.json 配置应用于名为 myResourceGroup 的资源组中的 myScaleSet VM 实例 :

az vmss extension set \
  --publisher Microsoft.Azure.Extensions \
  --version 2.0 \
  --name CustomScript \
  --resource-group myResourceGroup \
  --vmss-name myScaleSet \
  --settings customConfig.json

注意

文件名区分大小写。 为避免失败,请使用这些说明中所述的确切文件名。

将扩展应用到现有的规模集实例

升级所有实例以应用自定义脚本。 更新可能需要几分钟才能完成。

az vmss update-instances --resource-group myResourceGroup --name myScaleSet --instance-ids "*"

允许流量发到端口 80

若要允许流量流经负载均衡器到虚拟机,需要更新默认网络安全组。

az network nsg rule create --name AllowHTTP --resource-group myResourceGroup --nsg-name myScaleSetNSG --access Allow --priority 1010 --destination-port-ranges 80 

测试规模集

若要查看运行中的 Web 服务器,请使用 az network public-ip show 命令获取负载均衡器的公共 IP 地址。 以下示例获取创建为规模集一部分的“myScaleSetLBPublicIP”的 IP 地址:

az network public-ip show \
  --resource-group myResourceGroup \
  --name myScaleSetLBPublicIP \
  --query [ipAddress] \
  --output tsv

将负载均衡器的公共 IP 地址输入到 Web 浏览器中。 负载均衡器将流量分发到某个 VM 实例,如以下示例所示:

Nginx 中的基本网页

让 Web 浏览器保持打开状态,以便在下一步骤中可以看到更新的版本。

更改升级策略

在上一部分中,若要将更新的应用程序应用于所有规模集实例,需要手动升级。 若要将更新自动应用于所有现有的规模集实例,请将升级策略从手动更新为自动。 有关升级策略的详细信息,请参阅虚拟机规模集的升级策略

az vmss update \
    --name myScaleSet \
    --resource-group myResourceGroup \
    --set upgradePolicy.mode=automatic

更新应用部署

在当前 shell 中,创建名为“customConfigv2.json”的文件并粘贴下面的配置。 此定义运行应用程序安装脚本的 v2 更新版本:

{
  "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx_v2.sh"],
  "commandToExecute": "./automate_nginx_v2.sh"
}

使用 az vmss extension set 再次将自定义脚本扩展配置应用到规模集。 customConfigv2.json 用于应用更新版本的应用程序。

az vmss extension set \
  --publisher Microsoft.Azure.Extensions \
  --version 2.0 \
  --name CustomScript \
  --resource-group myResourceGroup \
  --vmss-name myScaleSet \
  --settings @customConfigv2.json

由于规模集现在使用的是自动升级策略,因此更新后的应用程序将自动应用于现有规模集实例。 刷新 Web 浏览器以查看更新后的应用程序。

Nginx 中更新的网页

清理资源

若要删除规模集和其他资源,请使用 az group delete 删除资源组及其所有资源。 --no-wait 参数会使光标返回提示符处,无需等待操作完成。 --yes 参数将确认是否希望删除资源,而不会有额外提示。

az group delete --name myResourceGroup --no-wait --yes

后续步骤

本教程介绍了如何使用 Azure CLI 在规模集中自动安装和更新应用程序:

  • 将应用程序自动安装到规模集
  • 使用 Azure 自定义脚本扩展
  • 更新规模集中运行的应用程序

请继续学习下一教程,了解如何自动缩放规模集。