代码之家  ›  专栏  ›  技术社区  ›  woter324

Azure模板:动态输出CopyIndex()迭代中创建的所有项

  •  4
  • woter324  · 技术社区  · 7 年前

    采用以下简单模板:

    {
      "$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 ,如何输出在副本中创建的所有网络接口,而不具体命名它们?

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

    /networkInterfaces 在给定的资源中,这将是朝着正确方向迈出的一步,但我似乎甚至无法做到这一点:

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

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

    我对这一点不知所措。

    更新:推理:

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

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

    为了简化事情(信不信由你),我将部署从PowerShell/VST/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
    

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   4c74356b41    7 年前

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

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

    对我来说,这整件事看起来很奇怪。一切似乎都有点不对劲;)