【问题标题】:Azure ARM Templates and REST APIAzure ARM 模板和 REST API
【发布时间】:2017-05-21 08:47:32
【问题描述】:

我正在尝试学习 Azure 资源模板,并尝试了解何时使用它们以及何时使用 REST API 背后的工作流。

我的感觉是,在 Azure 中创建虚拟网络和子网是一种相当少见的情况,一旦您按照自己的意愿进行了设置,就不会过于频繁地对其进行修改,您可以将内容部署到该结构中。

所以关于 ARM 模板,假设我有一个包含 VNET 和子网资源的模板。以https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-template-walkthrough#virtual-network-and-subnet 为例,我可能有:

{
"apiVersion": "2015-06-15",
"type": "Microsoft.Network/virtualNetworks",
"name": "[parameters('vnetName')]",
"location": "[resourceGroup().location]",
"properties": {
 "addressSpace": {
   "addressPrefixes": [
     "10.0.0.0/16"
   ]
 },
 "subnets": [
   {
     "name": "[variables('subnetName')]",
     "properties": {
       "addressPrefix": "10.0.0.0/24"
     }
   }
 ]
}
}

我将其部署到资源组。假设我然后添加一个负载均衡器并重新部署模板。在这种情况下,用户会被要求再次提供 vnetName 参数的值,当然不能提供相同的值,所以我们最终会得到另一个 VNET,这不是我们想要的。

您一次性定义 ARM 模板(VNET、LB、子网、NIC 等)然后进行部署的工作流程是什么?然后,当您想要部署 VM、规模集等时,您使用 REST API 部署然后到资源组/VNET 子网?或者有没有办法逐步构建一个 ARM 模板并多次部署它,如果 VNET 已经存在(例如),则不会提示用户提供另一个模板的详细信息?

我已经阅读并看到了增量模式(除非指定完整,否则默认),但不确定这是否相关以及如何使用它。

非常感谢您的帮助!

更新

好的,我现在可以使用 azure group deployment create -f azuredeploy.json -g ARM-Template-Tests -m Incremental 并修改了我的模板中的 VNET 资源

{
  "apiVersion": "2016-09-01",
  "type": "Microsoft.Network/virtualNetworks",
  "name": "[variables('virtualNetworkName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[variables('addressPrefix')]"
      ]
    },
    "subnets": [
      {
        "name": "[variables('subnetName')]",
        "properties": {
          "addressPrefix": "[variables('subnetPrefix')]"
        }
      }
    ]
  }
},

{
  "apiVersion": "2015-05-01-preview",
  "type": "Microsoft.Network/virtualNetworks",
  "name": "[parameters('virtualNetworkName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "subnets": [
      {
        "name": "[parameters('subnet1Name')]",
        "properties": {
          "addressPrefix": "[parameters('subnet1Prefix')]"
        }
      },
      {
        "name": "[parameters('gatewaySubnet')]",
        "properties": {
          "addressPrefix": "[parameters('gatewaySubnetPrefix')]"
        }
      }
    ]
  }
},

但子网不会改变。他们应该使用azure group deployment create -f azuredeploy.json -g ARM-Template-Tests -m Incremental

【问题讨论】:

    标签: azure azure-resource-manager azure-management-api


    【解决方案1】:

    我将继续使用此 Azure documentation。参考下面的相应部分:

    增量和完整部署

    在部署资源时, 您指定部署是增量更新或 完成更新。默认情况下,资源管理器将部署处理为 对资源组的增量更新。

    使用增量部署,资源管理器

    1. 保持不变资源组中存在但未在模板中指定的资源
    2. 添加模板中指定但资源组中不存在的资源
    3. 不重新配置资源组中存在的与模板中定义的条件相同的资源
    4. 重新配置已更新模板中设置的现有资源

    完成部署后,资源管理器:

    1. 删除资源组中存在但未在模板中指定的资源
    2. 添加模板中指定但资源组中不存在的资源
    3. 不重新配置资源组中存在的与模板中定义的条件相同的资源
    4. 重新配置已更新模板中设置的现有资源

    要选择增量更新或完全更新,这取决于您是否有正在使用的资源。如果 devops 要求始终使资源与 json 模板中定义的内容同步,则应使用 Complete Update 模式。使用模板和源代码部署资源的最大好处是可以防止配置漂移,使用Complete Update模式有好处。

    至于指定参数,如果在参数文件中指定,则不必再次指定。

    【讨论】:

    • 你知道如何通过cli而不是powershell使用增量更新吗?
    • @StuartBrown azure group deployment create -m "Incremental" -g "resource group name" -n "name of the deployment"。如需更多帮助,请使用azure group deployment create -h
    • 谢谢!我已对我的问题添加了更新,您是否希望通过增量部署应用我对模板所做的更改?
    • 您应该使用完整而不是增量,因为您更改了子网。
    • 不,它不能。但是,如果您从逻辑上考虑,此模式属性是用于部署的。所以在那个例子中看到类型,它是部署。换句话说,如果资源类型是部署,那么您可以拥有模式属性。
    【解决方案2】:

    可以以增量模式部署新模板,这会将新资源添加到现有资源组。只定义模板中的新资源,现有资源不会改变。

    从 powershell 使用以下 cmdlet

    New-AzureRmResourceGroupDeployment -ResourceGroupName "YourResourceGroupName" -TemplateFile "path\to\template.json" -Mode Incremental -Force

    【讨论】:

    • 谢谢!我一直在查看有关此文档的 CLI 版本,但它没有显示增量模式 docs.microsoft.com/en-us/azure/azure-resource-manager/… 的标志。你说Define only the new resources in the template, existing resources would not be altered.你的意思是我可以使用相同的模板并添加新资源并且用户输入参数的现有资源/请求不会受到影响?我也看到了在模板中的资源上设置部署模式的示例。有区别吗?
    • 我们保留一个包含资源组中所有资源的模板。它将用于灾难恢复或资源组需要移动到不同区域的情况。对于新版本部署,我们运行一个新模板,其中只定义了新资源。您可以在一个模板中定义所有资源并运行新版本部署。它应该可以正常工作,根据文档 Azure“不会以模板中定义的相同条件重新配置资源组中存在的资源”。 (下续)
    • 但是,我过去在运行脚本时遇到了糟糕的经历,其中定义的所有资源都被删除并重新创建了已在其上手动配置 AD 的现有 VM。幸好这是一个测试环境,但还是造成了一些麻烦。可能值得用模板中定义的所有资源进行测试,如果它运行良好,那就去试试吧。在过去遇到问题后,我决定不再承担可能破坏环境的进一步风险。通过在模板中仅定义新资源,我确信不会重新配置现有资源。
    【解决方案3】:

    我的经验法则是对于我想要拆除的东西,或者对于我想要跨订阅复制的东西,我使用 ARM 模板。

    例如,我们想要测试环境中的东西,我只是将其 ARM,根据开发人员请求的脚本构建(“嘿,我需要一个缓存”,“哦,顺便说一句,我需要开始使用服务总线”) ,使用增量模式,我们可以将其推送到 Dev,然后当我们迁移到不同的环境时,您只需部署到 Azure 中的不同订阅,它应该准备就绪。

    此外,我们已经开始在 VMSS 中配置我们自己的云负载测试代理,这是一个简单的 ARM 模板,由构建调用以扩展到 x 台机器,然后在完成后,我们只是垃圾资源组。它是可重复且可靠的,当然你可以编写脚本,但由于 TFS 有一个任务来部署这些东西(也有时间表)......

    我遇到的一个美妙的事情是 Key Vault,当您将其武装起来并从您的服务总线、存储帐户/任何东西中提取所有值时,您可以简单地获取连接字符串/密钥/任何东西并放入它们直接进入 Key Vault,所以你永远不必担心它,如果你想重新生成任何东西(比如开发人员想要更改缓存的名称或其他任何东西,或者不小心将密钥发布到 GitHub),只需重新部署(通常我只会丢弃整个资源组),它会为您更新保管库。

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      相关资源
      最近更新 更多