【问题标题】:ARM - how can I pass an argument to CustomScript extension?ARM - 如何将参数传递给 CustomScript 扩展?
【发布时间】:2017-03-18 01:36:27
【问题描述】:

我的模板中有一个 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:部署模板验证失败: '在资源上检测到循环依赖: '/subscriptions/0a4f2b9c-***-40b17ef8c3ab/resourceGroups/jm-web-test-var-1/providers/Microsoft.Compute/virtualMachineScaleSets/jm-web-test-var-1-master-vmss'。 请参阅https://aka.ms/arm-template/#resources 了解使用详情。'。

所以问题是 - 如何将私有 IP 传递给脚本?

【问题讨论】:

  • @4c74356b41 再次嗨 :-) 感谢您的评论 - 添加了模板链接。
  • @4c74356b41 没问题)请告诉我何时可以从 Github 中删除模板(即使没有敏感信息 - 它仍然是客户的代码)。
  • 那么你想将相同的参数传递给两个扩展还是你想怎么做?
  • @4c74356b41 是的,完全正确。该计划是 - 通过脚本为工人和其他经理运行joint。但要做到这一点 - 需要获取任何管理器的 IP,将其部署到主 VMSS 并将其作为参数传递给CustomScript

标签: azure azure-resource-manager


【解决方案1】:

因此,当您将 IP 设为静态但让其由 VM 部署分配时,您无法在同一资源中引用该 IP。有道理。

这样做的一种方法是将 NIC 与 VM 分开。与其将其作为 VM 的子资源,不如使其成为自己的资源,然后让 VM 依赖于 NIC。然后你可以给网卡分配一个静态IP,然后在VM的网络配置文件部分引用网卡,在自定义脚本扩展中引用网卡的IP。

编辑:啊,这可能只适用于虚拟机而不是规模集......

Edit2:另外,引用函数仅用于模板的输出部分。经过更多研究,您似乎可以将 IP 地址分配给负载均衡器。这可能对你有用!

【讨论】:

  • 谢谢,只是 - 我需要来自 VMSS 的盒子的私有 IP,而不是它的外部 IP(它是专用资源)。
  • 所以你应该从你设置的子网范围中知道规模集 IP 将是什么。如果您将子网范围设置为 10.0.0.0/24,例如。那么您的节点将始终从 10.0.0.4 开始,然后递增 1,(第一个和最后一个地址,加上另外 3 个地址,由 azure 保留。)这并不理想。对不起..
  • 是的,这是一个想法 - 使用硬编码 IP,注意到它总是以 10.0.0.4 开头。但它绝对不像生产解决方案 :-) 无论如何 - 谢谢。
  • 顺便说一句。不 - 它不会总是以 0.4 开头。有时 - 可能是0.5。那么 - 拥有一个同时包含 0.40.5 的数组并尝试 ssh 首先可用?呃……
  • 我不知道模板的其余部分是什么样子的——但我认为 Ed 在 2 部分上击中了它:1)使其成为静态 IP 和 2)使其成为 LB 的 IP。 #1 可能是可选的,您可以在资源的属性部分使用引用(除了输出),但由于这是一个 VMSS,如果您需要配置 VM,您并不总是知道编号.这听起来很重要,但如果没有看到整个模板,也很难说 - 但如果满足依赖关系,您的语法就会正常工作。
【解决方案2】:

好的,所以我在这里做了一些事情,我建议您使用嵌套模板方法来解决这个问题。

我不会粘贴整个模板,而只是从主 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]"
            }
        }
    }
}

唯一真正的缺点 - 您必须将最初预配的规模集成员升级到最新版本。所有新的都将是最新的(因此具有自定义脚本扩展名)。对于您的“从属”VMSS,您不需要嵌套模板方法,只需将其“依赖”为“主”VMSS。

edit:对不起,我花了这么长时间,现在时间有点短。

【讨论】:

  • > 对不起,我花了这么长时间没问题,无论如何,谢谢 - 真的很感激!我明天或星期一试试。或者星期二... 准备项目发布 - 大量的工作。 Azure 有很多问题 :-(
  • 我想是的))位我真的很惊讶这么简单的任务需要这么复杂:-| Azure的支持连我想达到的都达不到……
  • azure 支持令人讨厌,只需使用 SO :)
  • 哦,原来如此! :-D
  • 嗨,@4c74356b41。今天晚上试过了——但还没有运气。 VMSSextension 部署成功,但是 - 部署后我什至看不到主 VMSS 中 VM 上的 /var/lib/waagent/custom-script/download/0 目录。我明天再试一次,可能错过了什么。如果有的话 - 我可以和你分享我的测试模板吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多