azure-virtual-machine - 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 的帖子标记为回答,他提出了这个想法)。
解决方案
首先,我真的没有看到任何 hacky,它是一种有效的方法。
传入数据的另一种方法 - 使用自定义数据属性。它将作为 vm 中的文件提供,我不记得它是否经过 base64 编码,但您可以在配置后快速计算出来。
另一种方法是为 VM 使用托管服务标识。这样,您只需分配 VM 适当的权限,它就可以从存储中下载脚本,而无需显式传递它们。
无论哪种方式,您都需要将脚本传递给 vm 并使用脚本扩展名调用它。您可以在其中使用带有脚本的自定义图像。或者您可以将脚本放在公开可用的 url 中,以便 vm 始终可以拉取并执行它(在这种情况下,您需要 MSI 为您处理身份验证)。
您可以做的另一件事是在此期间直接从 VM 内部的KV 中提取证书。供应。
推荐阅读
- python - 是否可以从另一个扩展添加 vscode-python linter?
- python - 获取并压缩 txt 文件,然后将内容压缩到最大长度值为 50
- javascript - 如何使用数组 JavaScript 访问对象上的嵌套键?
- assembly - x86-64 在线汇编,带有 IDE,例如 https://www.mycompiler.io/new/asm-x86_64
- xcode - NSLocalizedDescription=模拟器不支持远程通知
- c++ - c++模板方法定义不能识别使用别名
- python - Difference between torch.flatten() and nn.Flatten()
- c - 无法在 C 中打印出带有可变参数的 char *
- perl - 如何在文件夹和子文件夹中运行命令
- kubernetes - Kubernetes 负载均衡 HTTP/1.1 请求