Azure ARM模板和REST API

问题描述 投票:2回答:3

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

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

所以关于ARM模板,假设我有一个包含VNET和Subnet资源的模板。以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"
     }
   }
 ]
}
}

我部署到资源组。假设我然后添加Load Balancer并重新部署模板。在这种情况下,然后要求用户再次提供vnetName参数的值,当然不能提供相同的值,因此我们最终会得到另一个不是我们想要的VNET。

那么您是一次性定义ARM模板(VNET,LB,子网,NIC等)然后部署的工作流程吗?然后,当您要部署VM,Scale Sets等时,您使用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
3个回答
2
投票

我要背上这个Azure documentation。参考下面的相应部分:

增量和完整部署

部署资源时,指定部署是增量更新或完整更新。默认情况下,资源管理器将部署作为资源组的增量更新进行处理。

With incremental deployment, Resource Manager

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

With complete deployment, Resource Manager:

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

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

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


1
投票

可以在增量模式下部署新模板,这将为现有资源组添加新资源。仅定义模板中的新资源,不会更改现有资源。

从powershell使用以下cmdlet

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


0
投票

我的经验法则是我想要拆除的东西,或者我希望在订阅中复制的东西,我使用ARM模板。

例如,我们想要测试环境中的东西,我只需要它,在开发人员请求事物的基础上构建脚本(“我需要一个缓存”,“我需要开始使用服务总线的方式”),使用增量模式我们可以将它推送到Dev,然后当我们迁移到不同的环境时,您只需部署到Azure中的其他Subscription,它应该已经准备好了。

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

我遇到的一件很棒的事情就是Key Vault,当你把它装起来并从你的服务总线,存储帐户/ whatevers中剔除所有价值时,你可以简单地获得连接字符串/键/ whatevers并将它们直接放入密钥保险库,所以你永远不需要担心它,如果你想重新生成任何东西(比如一个开发人员想要更改缓存的名称或其他什么,或者意外地将密钥发布到GitHub),只需重新部署(通常我' ll只是废弃整个资源组)并为你更新保险库。

© www.soinside.com 2019 - 2024. All rights reserved.