我的模板中有一个OUTPUTS部分:
"outputs": {
"MasterFirstIPConfig": {
"type": "string",
"value": "[reference(variables('masterVM'),'2016-09-01').ipConfigurations[0].properties.privateIPAddress]"
}
}
它按预期工作 - 我看到VM的私有IP。
接下来 - 我想将此IP用作CustomScript
扩展名的参数,如下所示:
"settings": {
"fileUris": [
"https://utils.blob.core.windows.net/scripts/swarm_master_provision.sh"
],
"commandToExecute": "[concat('bash swarm_master_provision.sh ', reference(variables('masterVM'),'2016-09-01').ipConfigurations[0].properties.privateIPAddress)]"
},
这里的问题是reference()
会导致依赖性错误:
错误:InvalidTemplate:部署模板验证失败: '在资源上检测到循环依赖: ' /订阅/ 0a4f2b9c - *** - 40b17ef8c3ab / resourceGroups / JM-web的测试-VAR-1 /提供商/ Microsoft.Compute / virtualMachineScaleSets / JM-web的测试-VAR -1-主vmss&#39 ;。 有关使用详情,请参阅https://aka.ms/arm-template/#resources。'。
所以问题是 - 如何将私有IP传递给脚本?
答案 0 :(得分:0)
因此,当您使IP静态但让它由VM部署分配时,您无法在同一资源中引用该IP。有道理。
这样做的一种方法是将VM与VM分开。不要将其作为VM的子资源,而是将其作为自己的资源,然后让VM依赖于NIC。然后,您可以为NIC分配静态IP,然后引用VM的网络配置文件部分中的NIC,以及自定义脚本扩展中的NIC的IP。
编辑:啊这可能只适用于VM而不是缩放集......
Edit2:此外,参考函数仅用于模板的输出部分。经过一番研究后,您可以将IP地址分配给负载均衡器。这可能适合你!
答案 1 :(得分:0)
好的,所以我在这里做了些什么,我建议你使用嵌套模板方法解决这个问题。
我不会粘贴整个模板,只是从主VMSS中删除扩展配置,然后将其移到单独的模板中,并在模板中创建一个新步骤:
{
"apiVersion": "2015-01-01",
"name": "VMSSextension",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachineScaleSets/', variables('masterVMSSname'))]"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "http://pastebin.com/raw/GsNTiAMc", ## << You can take a look at the nested template
"contentVersion": "1.0.0.0"
},
"parameters": {
"value": {
"value": "[variables('masterVMSSname')]"
},
"value2": {
"value": "[reference(variables('masterVM'),'2016-09-01').ipConfigurations[0].properties.privateIPAddress]"
}
}
}
}
唯一真正的缺点 - 您必须升级最初配置为最新版本的比例集成员。所有新的都是最新的(所以使用自定义脚本扩展)。对于你的&#34;奴隶&#34; VMSS,您不应该需要嵌套模板方法,只需将其设为&#34;依赖&#34; &#34;主人&#34; VMSS。
编辑:对不起,我花了这么长时间,现在有点短暂。