首页 > 解决方案 > Azure VM 规模集:是否可以在不从 URL 下载的情况下传递引导脚本/设置?

问题描述

我可以看到使用自定义脚本扩展可以引导新的虚拟机(在规模集中)。要访问脚本,它需要 Azure 存储 URI 和凭据。这种方法对我不起作用,因为(内部策略)不允许传递存储凭据。

我的 VMSS 已分配服务标识,后者已在 KeyVault 中注册。因此,直接在盒子上获取凭据非常简单。但为此,我至少需要小的引导脚本 =)

我发现了一种通过自定义脚本扩展来实现这一目标的 hacky 方法:

$bootstrapScriptPath = Join-Path -Path $PSScriptRoot -ChildPath "bootstrap.ps1"
$bootstrapScriptBlock = get-command $bootstrapScriptPath | Select -ExpandProperty ScriptBlock
$installScriptBase64 = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($bootstrapScriptBlock.ToString()))

"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -EncodedCommand ', parameters('installScriptBase64'))]"

但我想知道是否有更好的解决方案。

本质上,我需要云服务提供的东西——上传有效负载和配置设置的能力。

解决方案

(注意,这适用于 Windows VM。对于 Linux VM,有一种更简单的方法 - 感谢@sendmarsh)

请参阅下面的实际实现(注意,我将@4c74356b41 的帖子标记为回答,他提出了这个想法)。

标签: azure-virtual-machineazure-vm-scale-set

解决方案


首先,我真的没有看到任何 hacky,它是一种有效的方法。

传入数据的另一种方法 - 使用自定义数据属性。它将作为 vm 中的文件提供,我不记得它是否经过 base64 编码,但您可以在配置后快速计算出来。

另一种方法是为 VM 使用托管服务标识。这样,您只需分配 VM 适当的权限,它就可以从存储中下载脚本,而无需显式传递它们。

无论哪种方式,您都需要将脚本传递给 vm 并使用脚本扩展名调用它。您可以在其中使用带有脚本的自定义图像。或者您可以将脚本放在公开可用的 url 中,以便 vm 始终可以拉取并执行它(在这种情况下,您需要 MSI 为您处理身份验证)。

您可以做的另一件事是在此期间直接从 VM 内部的KV 中提取证书。供应。


推荐阅读