Azure 模板 : Dynamically output all items created in CopyIndex() iteration

标签 azure azure-rm-template

采用以下简单模板:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "variables": {
    "nicName": "TESTNIC-",
    "ipConfigName": "ipconfig",
    "subnetRef": "/subscriptions/90a34ad-46aa-01a3-a3d4-223ac11bd6b3/resourceGroups/aResourceGroup/providers/Microsoft.Network/virtualNetworks/aVirtualNetwork/subnets/subnet-032"
  },
  "resources": [
    {
      "apiVersion": "2017-03-01",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[concat(variables('nicName'),copyIndex())]",
      "location": "[resourceGroup().location]",
      "tags": {
        "displayName": "[concat(variables('nicName'),copyIndex())]"
      },
      "dependsOn": [],
      "copy": {
        "count": 2,
        "name": "nicLoop"
      },
      "properties": {
        "ipConfigurations": [
          {
            "name": "[variables('ipconfigName')]",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
      }
    }
  ],
  "outputs": {
    "oNic": {
      "type": "string",
      "value": "[concat(variables('nicName'),0)]"
      //"value": "[resourceGroup().name]"
    }
  }
}

由于 outputs.oNIC.value 中不允许 copyIndex(),因此如何输出在副本中创建的所有网络接口(interface),而不具体命名它们?

在上面的模板中,我指定了两个网卡,但实际上,还会有其他资源类型,而且我不知道会有多少。

即使能够返回给定资源中 /networkInterfaces 的所有实例也将是朝着正确方向迈出的一步,但我似乎无法做到这一点:

"outputs": {
  "oNic": {
    "type": "object",
    "value": "[reference(concat(resourceGroup().id,'Microsoft.Network/networkInterfaces'))]"
  }
}

"outputs": {
  "oNic": {
    "type": "object",
    "value": "[reference('Microsoft.Network/networkInterfaces')]"
  }
}

我对这个一无所知。 TIA

更新:推理:

尽可能简短:部分 IP 地址位于 VM 主机名中(客户端要求),因此 VM 的名称是在部署时生成的。模板层次结构如下所示:

#Deploy VM
DeployVM.json
    └ createNIC.json
        └ CreateVM.json
            └ createDataDisks.json

#Configure VM
ConfigureVM.json

CreateDataDisks实际模板是由powershell“写出”的(由于不同类型数据盘的复杂性)

为了简化事情(无论你相信与否),我已将部署拆分为来自 PowerShell/VSTS/RunBook 的两个单独的部署调用。第一个实际部署 VM,第二个使用 DSC 和 customScriptExtension 资源对其进行配置。一个完整的部署可能有多个具有不同角色的服务器,例如DB、WEB、客户端,尽管一组模板/调用只会部署一个角色。完整的 powershell 脚本可能如下所示:

$oDeploy = New-AzureRmResourceGroupDeployment -TemplateFile deployDatabase.json -role "Database" -Quantity 1
New-AzureRmResourceGroupDeployment -TemplateFile configureDatabase.json -role "Database" -VMName $oDeploy.vmNames

$oDeploy = New-AzureRmResourceGroupDeployment -TemplateFile deployWeb.json -role "Web" -Quantity 4
New-AzureRmResourceGroupDeployment -TemplateFile configureWeb.json -role "Web" -VMName $oDeploy.vmNames

$oDeploy = New-AzureRmResourceGroupDeployment -TemplateFile deployClientTypeA.json -role "ClientTypeA" -Quantity 1
New-AzureRmResourceGroupDeployment -TemplateFile configureClientTypeA.json -role "ClientTypeA" -VMName $oDeploy.vmNames

$oDeploy = New-AzureRmResourceGroupDeployment -TemplateFile deployClientTypeB.json -role "ClientTypeB" -Quantity 2
New-AzureRmResourceGroupDeployment -TemplateFile configureClientTypeB.json -role "ClientTypeB" -VMName $oDeploy.vmNames

虽然我可能必须做这样的事情,除非我可以使用 CopyIndex 迭代模板中的数组(我认为我可以。只需将其放在那里):

$oDeploy = New-AzureRmResourceGroupDeployment -TemplateFile deployWeb.json -role "Web" -Quantity 4
foreach($vm in $oDeploy.vm)
{
    New-AzureRmResourceGroupDeployment -TemplateFile configureWeb.json -role "Web" -VMName $vm
}

很好的计划(我认为),直到意识到我无法从deploy{Role}.json 中获取所有虚拟机名称以传递给configure{role}.json。

另一个问题与这些讨厌的数据磁盘有关。这个想法是,可以通过修改/添加来重新运行部署,因此第一次运行可能会创建三个数据磁盘,而第二次运行会创建第四个数据磁盘。真正的问题是如何保持 LUN ID 的唯一性。在第一次部署运行中,它从零开始并递增到 2。在第二次运行中,它再次从零开始,但已采用零。我需要做的是对数据磁盘资源总数求和并偏移计数(按 3),因此在第二次运行时,LUN ID 从 2 开始。据我所知,无法对纯模板中的资源数量进行求和,因此我使用 powershell,但是由于可能不止一个虚拟机具有多个数据磁盘,因此我需要针对特定​​虚拟机,我需要它的名称,它需要从父模板输出,以便 powershell 可以选取它并使用它。

最佳答案

我可以向你保证 - 你的问题不会得到合理的答案;)但我看到了一些我想快速探究的事情。

  1. 数据盘,我不认为模板中不能创建任何数据盘组合。另外,如果您想向现有虚拟机添加 1 个磁盘,则必须创建一个包含所有先前磁盘和新磁盘的模板(如果您仅创建一个仅包含新磁盘的模板,则所有旧磁盘都将被分离)。
  2. 为什么你有 4 级模板?您所描述的内容可以在平面模板中完成
  3. 我不知道不同角色的不同模板背后的原因,但在某些情况下这可能是有意义的,尽管很难想象这样的情况。
  4. 看起来您可以从模板\部署中的配置文件中受益,但您当前所描述的There is no way that I know of to sum the number of resources in pure templates听起来很奇怪。您需要将磁盘添加到特定虚拟机,但对环境中的任何内容一无所知。 :)

对我来说,整个交易看起来很奇怪。一切似乎都有点不对劲;)

关于Azure 模板 : Dynamically output all items created in CopyIndex() iteration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45612807/

相关文章:

azure - 用于在 Azure 虚拟机上启用更新管理的 ARM 模板

Azure ARM 模板 - 参数与属性的静态值相结合

azure - 如何通过 ARM 模板部署 Synapse Serverless 数据库?

c# - 使用 JSON 序列化器反序列化 Mongodb 对象 ID

azure - 控制触发器 blob App Function Azure

node.js - 如何在Azure Functions node.js中获取客户端IP地址?

Azure 容器服务 (AKS) kubeconfig 文件已过时

iis - Azure 网站上偶尔出现 503 错误

azure,通过arm模板添加提供商

azure - 在 Azure ARM 模板中使用空/可选参数