Azure 模板:动态输出在 CopyIndex() 迭代中创建的所有项目
Azure templates: Dynamically output all items created in CopyIndex() iteration
采用以下简单模板:
{
"$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(),我如何输出在副本中创建的所有网络接口,而不特别命名它们?
在上面的模板中,我指定了两个nic,但实际上还会有其他资源类型,不知道会有多少。
即使能够 return 给定资源中 /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实际模板是"written out"powershell(由于不同类型数据盘的复杂性)
为了简化事情(信不信由你),我将部署拆分为来自 PowerShell / VSTS / RunBook 的两个单独的部署调用。第一个实际部署 VM,第二个使用 DSC 和 customScriptExtension 资源对其进行配置。一个完整的部署可能会有多个不同角色的服务器,比如DB、WEB、client,虽然一套模板/调用只会部署一个角色。完整的 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} 中获取所有 VM 名称。json 传递给 configure{role}。json。
另一个问题是与这些讨厌的数据磁盘有关。这个想法是部署可以通过修改/添加重新运行,所以也许第一个 运行 创建三个数据磁盘,而第二个创建第四个数据磁盘。真正的问题在于保持 LUN ID 的唯一性。在第一个部署 运行 中,它从零开始并递增到 2。在第二个 运行 中,它再次从零开始,但零已经被采用。我需要做的是对数据磁盘资源总数求和并偏移计数(减去 3),因此在第二个 运行 上,LUN ID 从 2 开始。据我所知,无法对纯模板中的资源数量求和,因此我使用 powershell, 但 因为可能有多个数据磁盘的虚拟机,我需要定位我需要名称的特定 VM,需要从父模板输出,以便 powershell 可以选择并使用它。
我可以向你保证 - 你的问题不会得到合理的答案 ;) 但我看到一些我想快速戳一下的东西。
- 数据盘,我认为在模板中不可以任意组合数据盘。此外,如果要向现有 vm 添加 1 个磁盘,则必须创建一个包含所有先前磁盘和新磁盘的模板(如果您只创建一个仅包含新磁盘的模板,所有旧磁盘将被分离)。
- 为什么你有4个级别的模板?您所描述的可以在平面模板中完成
- 我不知道不同角色的不同模板背后的原因,但在某些情况下这可能是有意义的,尽管很难想象这样的情况。
- 看起来您可以从 templates\deployments 中的配置文件中获益,但您目前描述的
There is no way that I know of to sum the number of resources in pure templates
听起来很奇怪。您需要将磁盘添加到特定的虚拟机,但对环境中的任何内容一无所知。 :)
对我来说,这整个交易看起来很奇怪。一切似乎都有点不对劲 ;)
采用以下简单模板:
{
"$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(),我如何输出在副本中创建的所有网络接口,而不特别命名它们?
在上面的模板中,我指定了两个nic,但实际上还会有其他资源类型,不知道会有多少。
即使能够 return 给定资源中 /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实际模板是"written out"powershell(由于不同类型数据盘的复杂性)
为了简化事情(信不信由你),我将部署拆分为来自 PowerShell / VSTS / RunBook 的两个单独的部署调用。第一个实际部署 VM,第二个使用 DSC 和 customScriptExtension 资源对其进行配置。一个完整的部署可能会有多个不同角色的服务器,比如DB、WEB、client,虽然一套模板/调用只会部署一个角色。完整的 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} 中获取所有 VM 名称。json 传递给 configure{role}。json。
另一个问题是与这些讨厌的数据磁盘有关。这个想法是部署可以通过修改/添加重新运行,所以也许第一个 运行 创建三个数据磁盘,而第二个创建第四个数据磁盘。真正的问题在于保持 LUN ID 的唯一性。在第一个部署 运行 中,它从零开始并递增到 2。在第二个 运行 中,它再次从零开始,但零已经被采用。我需要做的是对数据磁盘资源总数求和并偏移计数(减去 3),因此在第二个 运行 上,LUN ID 从 2 开始。据我所知,无法对纯模板中的资源数量求和,因此我使用 powershell, 但 因为可能有多个数据磁盘的虚拟机,我需要定位我需要名称的特定 VM,需要从父模板输出,以便 powershell 可以选择并使用它。
我可以向你保证 - 你的问题不会得到合理的答案 ;) 但我看到一些我想快速戳一下的东西。
- 数据盘,我认为在模板中不可以任意组合数据盘。此外,如果要向现有 vm 添加 1 个磁盘,则必须创建一个包含所有先前磁盘和新磁盘的模板(如果您只创建一个仅包含新磁盘的模板,所有旧磁盘将被分离)。
- 为什么你有4个级别的模板?您所描述的可以在平面模板中完成
- 我不知道不同角色的不同模板背后的原因,但在某些情况下这可能是有意义的,尽管很难想象这样的情况。
- 看起来您可以从 templates\deployments 中的配置文件中获益,但您目前描述的
There is no way that I know of to sum the number of resources in pure templates
听起来很奇怪。您需要将磁盘添加到特定的虚拟机,但对环境中的任何内容一无所知。 :)
对我来说,这整个交易看起来很奇怪。一切似乎都有点不对劲 ;)