65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ARM 模板将您的资源部署到 Azure

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (3投票s)

2018 年 8 月 16 日

CPOL

9分钟阅读

viewsIcon

7281

通过 Azure 资源管理器模板 (ARM 模板) 将基础结构部署到 Azure,将持续部署向前推进了一步。 文章“使用 ARM 模板将资源部署到 Azure”首次发布于 Sander Rossel。

上周,我们讨论了持续集成和持续部署到 Azure。 我们使用 Visual Studio Team Services (VSTS)、Azure 和 Visual Studio 设置了一个应用服务,并部署了一个 .NET Core 应用程序。 在本文中,我们将使用Azure 资源管理器和 ARM 模板来探索 Azure 资源或基础结构的部署。 在本文中,我们将再次使用 Azure、VSTS 和 Visual Studio 2017。 如果您还不熟悉 Azure 和 VSTS,我建议您阅读我之前的文章。

本文的示例代码可在我的 GitHub 个人资料上找到。

ARM 模板

那么,这个 Azure 资源管理器模板或 ARM 模板究竟是什么? 基本上,它只是描述您想在 Azure 中拥有的资源(如应用服务、数据库和存储帐户)的一些 JSON。 Azure 可以处理此模板,并根据模板创建或更新我们的资源。 这也称为基础结构即代码 (IaC)。 我假设您知道 JSON 是什么,所以这里不作解释。

ARM 模板是声明式的,也就是说,您描述您想要什么,而不是如何想要。 在实践中,这意味着您不编写代码来实际创建资源,而只需指定您想要拥有的资源。

Azure 中的 ARM 模板

让我们来看看这是什么样的。 如果您转到 Azure 中的任何资源,您应该能够从左侧菜单获取 ARM 模板。 我仍然有我之前的文章中的 imunique Web App,让我们看看它是什么样的。 只需找到“自动化脚本”菜单项。

在打开的面板的左侧,您可以找到构成 ARM 模板的不同节点。

ARM template nodes

ARM 模板节点

如您所见,此(生成的)模板有三个输入参数,没有变量,但有三个实际资源。 参数是脚本的输入,变量是计算值。 目前,我们主要对资源感兴趣。 我们有“serverfarm”或托管计划;实际的 Web 应用,imunique;以及主机名绑定,这使得您的 Web 应用可在 imunique.azurewebsites.net 上访问(Azure 为我们创建了它)。

这是描述(部分)Web 应用的实际 JSON 模板的一部分。

ARM templates in Azure

Azure 中的 ARM 模板

所以有好消息也有坏消息。 好消息是 Azure 可以为我们创建大多数 ARM 模板。 坏消息是它们并不总是高质量的,甚至不可用。 当然,我们可以根据需要进行调整。

Azure 资源组项目

让我们创建自己的 ARM 模板。 打开 Visual Studio 2017,创建一个新的“Azure 资源组”项目(在“”下找到),并随意命名。 我已将我的解决方案命名为AzureResourceSamples,不同的项目具有用于不同资源的 ARM 模板。 同样,您可以在我的 GitHub 个人资料上找到它。

创建项目后,您可以从 Visual Studio 中选择一个预定义的模板,例如 Web 应用。 您也可以从 GitHub 上的Azure 快速入门模板中获取模板。 有成百上千个模板,从 Web 应用到虚拟机再到数据库。 您也可以选择一个空模板,以后可以添加资源。 我从 Visual Studio 模板中选择了“Web 应用”。 这会创建一个带有托管计划、Application Insights 和自动缩放功能的 Web 应用。 ARM 模板可在WebSite.json文件中找到。 我建议您仔细研究。

Azure Resource Group project

Azure 资源组项目

我们可以做的第一件事是右键单击 JSON 轮廓中的“AutoScaleSettings”并删除它。 目前我们也不需要所有 Application Insights 警报规则,所以也删除它们。 事实上,让我们保持简单,也删除“AppInsightsComponent”。 我们留下了一个非常基本的模板,它只创建了一个托管计划和一个 Web 应用。 这是包含 Web 应用和托管计划的“resources”节点,但不包含参数和变量。

"resources": [
  {
    "apiVersion": "2015-08-01",
    "name": "[parameters('hostingPlanName')]",
    "type": "Microsoft.Web/serverfarms",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "HostingPlan"
    },
    "sku": {
      "name": "[parameters('skuName')]",
      "capacity": "[parameters('skuCapacity')]"
    },
    "properties": {
      "name": "[parameters('hostingPlanName')]"
    }
  },
  {
    "apiVersion": "2015-08-01",
    "name": "[variables('webSiteName')]",
    "type": "Microsoft.Web/sites",
    "location": "[resourceGroup().location]",
    "tags": {
      "[concat('hidden-related:', resourceGroup().id, 
       '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource",
      "displayName": "Website"
    },
    "dependsOn": [
      "[resourceId('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
    ],
    "properties": {
      "name": "[variables('webSiteName')]",
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
    }
  }
]

Visual Studio 中的部署

现在,让我们使用 Visual Studio 将它们部署到 Azure。 只需右键单击您的项目,然后从下拉菜单中选择“部署”,然后选择“新建…”。 在弹出的表单中,您可以设置您的 Microsoft 帐户、您的 Azure 订阅、您要部署到的资源组以及模板参数(这些存储在*.parameters.json文件中)。 确保您填入了参数值,否则部署将失败。 现在只需单击“部署”按钮,然后浏览到您的 Azure 门户。 如果一切顺利,您现在应该会在您选择的资源组中看到一个新的托管计划和一个新的 Web 应用。

如果正在部署的资源已存在,Azure 将更新该资源,使其与 ARM 模板匹配。 您可以通过 ARM 模板设置可以通过 Azure 门户设置的几乎所有属性。

关于 ARM 模板语法的一些注意事项:当您需要非静态string(参数、变量或函数的结果)时,您可以使用"[...]”语法。 要使用参数,您可以使用"[parameter('paramName')]”,要使用变量,您可以使用"[variable('varName')]”。 另一个非常方便的函数是concat,您可以使用它,例如"[concat('staticstring', variable('nonstatic'))]"。 其他有用的函数是resourceGroup()subscription(),它们可以用来获取当前资源组 ID 或位置,或订阅 ID。

按资源部署

由于可以重用托管计划,您可能不想将它们一起部署。 创建一个仅包含托管计划的模板很容易。 只需创建一个空模板并添加一个“应用服务计划 (服务器场)”资源。 结果与上一个示例中的内容基本相同,但没有 Web 应用。

因此,让我们创建一个仅包含 Web 应用的模板。 这有点棘手,因为 Azure 和 Visual Studio 都需要一个带有 Web 应用的托管计划。 理想情况下,您希望能够在部署时设置托管计划,因为您可能会为不同环境拥有不同的托管计划。 由于从已有内容开始更容易,所以只需为带有托管计划的 Web 应用创建模板。

参数

我们要做的第一件事是添加我们自己的参数。 我们希望能够设置托管计划、托管计划的资源组(Azure 默认会在当前资源组中查找)以及 Web 应用的名称,因为我们不想要像上一个示例那样的随机名称。 我为“hostingPlanName”和“hostingPlanResourceGroup”设置了默认值,因为我们(目前)最有可能使用这些值。

"parameters": {
  "hostingPlanName": {
    "defaultValue": "MySamplePlan",
    "type": "string"
  },
  "hostingPlanResourceGroup": {
    "defaultValue": "imunique",
    "type": "string"
  },
  "webSiteName": {
    "type": "string"
  }
},

变量

下一部分是事情变得棘手的地方。 除“serverFarmId”变量(即托管计划)外,其他都相当直接。 由于托管计划可以位于不同的资源组中,因此我们必须指定资源的完整路径,包括我们的订阅 ID。 虽然可以在不同订阅之间共享资源,但我们真的不想那样做,所以我坚持使用当前订阅。

  "variables": {
    "serverFarmId": "[concat('subscription/', subscription().id ,
     '/resourceGroups/', parameters('hostingPlanResourceGroup'),
     '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
  },
  "resources": [
    {
      "apiVersion": "2015-08-01",
      "name": "[parameters('webSiteName')]",
      "type": "Microsoft.Web/sites",
      "location": "[resourceGroup().location]",
      "tags": {
        "[concat('hidden-related:', variables('serverFarmId'))]": "Resource",
        "displayName": "Website"
      },
      "properties": {
        "name": "[parameters('webSiteName')]",
        "serverFarmId": "[variables('serverFarmId')]"
      }
    }
  ]

现在尝试将其再次部署到一个新资源组,但保留现有资源组中已存在的托管计划。 您现在可以使用同一订阅中的任何其他资源组中的任何托管计划将此 Web 应用部署到任何资源组。

将 VSTS 连接到 Azure Active Directory

在我们继续之前,我们必须做一件非常小的事情。 前往 Azure 并查找“Team Services 管理”。 您应该能在那里看到您的 VSTS 帐户。 只需单击您的帐户,然后在弹出的选项窗格中,单击“连接 AAD”按钮。 这会将您的 VSTS 用户连接到 Azure Active Directory (AAD)。 当我们准备在 VSTS 中设置 Azure 资源部署时,我们需要它。

VSTS in Azure

Azure 中的 VSTS

如果立即不起作用,请先转到 Azure AD 并创建一个目录,然后尝试再次连接。

使用 VSTS 进行持续部署

我们现在准备好将我们的 ARM 模板与 Web 应用一起部署,或者将其作为独立版本进行部署。 前往 VSTS 并创建一个新项目或使用现有项目。 在您的项目中,前往发布选项卡,创建一个新管道,然后选择“空进程”。

您可能希望在 VSTS 中托管示例。 我使用了 GitHub,并且可以很好地将 GitHub 连接到 VSTS(尽管这不在本文的讨论范围内,所以您需要自己弄清楚)。 不过,这样做非常简单,只需创建一个新管道,添加一个构件,然后将 GitHub 设置为源类型。 从那里,VSTS 将指导您完成为 VSTS 设置 GitHub 授权。

总之,创建一个新的发布管道并将您的构件设置为 ARM 模板存储库。 您可以启用持续部署(使用构件的右上角的闪电图标)。 将您的环境重命名为“Dev”或您喜欢的任何名称。

Azure 资源组部署

现在是时候添加一个任务了。 前往您的 Dev 环境的“任务”页面,然后添加“Azure 资源组部署”(在“部署”下)。 选择您的“Azure 订阅”并单击“授权”按钮。 由于我们已经在 Azure AD 中设置了 VSTS,因此应该可以工作。 将“操作”保留为“创建或更新资源组”。 然后选择您要部署到的资源组,您可以从下拉列表中选择一个,也可以键入任何您想要的名称。 接下来,您必须选择您的资源组的位置,因此选择您选择的组的位置或设置新资源组的位置。

接下来我们需要设置的是“模板”。 此字段有一个方便的浏览按钮,请使用它并选择“WebApp”文件夹中的“WebSite.json”,以便 VSTS 创建或更新 Web 应用。 对“模板参数”执行相同的操作,但改选择“WebSite.parameters.json”文件。 在“覆盖模板参数”字段中,您可以覆盖您的参数,您应该这样做。“hostingPlanName”和“hostingPlanResourceName”应具有正确的默认值,但您可能需要更改“webSiteName”。

VSTS release pipeline

VSTS 发布管道

设置好这些之后,您就可以开始了! 给您的发布管道命名,保存它,然后创建一个新版本。 如果一切顺利,您的 Web 应用应该会在您的 Azure 帐户中创建。

如果一切顺利,您可以克隆您的 Dev 环境,然后简单地覆盖您的参数(并可能更改您的资源组),然后创建一个 Test 环境。

总结

就是这样。 自动将 Web 应用部署到 Azure 确实如此简单。 不仅如此,您还可以使用 ARM 模板部署虚拟机、数据库、队列、存储帐户以及几乎所有您可以想到的东西。 如果您启用了持续部署,当您将提交推送到 Git 时,您的部署将自动开始。 而且没有任何东西可以阻止您在同一部署中也部署您的实际软件或其他 Azure 资源。

再次,请记住删除您的资源,否则您将被收费。

祝您编码愉快!

文章 使用 ARM 模板将资源部署到 Azure 首次发布于 Sander Rossel

© . All rights reserved.