Azure虚拟机规模集:能否无需从URL下载传递引导脚本/配置?
Azure VMSS 无凭据引导脚本部署方案(Windows 环境)
问题背景
我之前尝试用Custom Script Extension引导虚拟机规模集(VMSS)中的新VM,但常规流程要求提供Azure存储URI和凭据,这和内部安全政策冲突——我们禁止传递存储凭据。好在我的VMSS已经配置了托管服务标识,并且该标识已在KeyVault中完成注册,允许直接在虚拟机上获取所需凭据,只需要一个轻量的引导脚本来衔接。
临时实现方案
目前我用了一个临时 workaround:把本地的引导脚本转换成Base64编码,直接通过Custom Script Extension的commandToExecute参数执行,无需依赖外部存储。具体代码如下:
首先是PowerShell编码脚本:
$bootstrapScriptPath = Join-Path -Path $PSScriptRoot -ChildPath "bootstrap.ps1" $bootstrapScriptBlock = Get-Command $bootstrapScriptPath | Select-Object -ExpandProperty ScriptBlock $installScriptBase64 = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($bootstrapScriptBlock.ToString()))
然后在Custom Script Extension的ARM模板配置中引用这个编码后的字符串:
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -EncodedCommand ', parameters('installScriptBase64'))]"
更优方案探索
不过这个临时方法还是有点繁琐,我一直在找更优雅的实现,本质上是希望能拥有类似云服务那样直接上传负载、配置设置的能力,避免手动编码脚本的步骤。
推荐解决方案
针对Windows VM,我们可以基于托管标识+KeyVault的组合实现无凭据的脚本部署(注意:Linux VM有更简便的原生实现方式,感谢@sendmarsh的提示)。这个思路由@4c74356b41提出,我已经将对应的帖子标记为官方解决方案,核心逻辑是:
- 确保VMSS的托管标识拥有KeyVault的
Secret Get权限,用于获取脚本存储相关的授权凭据 - 在VM启动阶段,通过自定义扩展调用PowerShell脚本,利用托管标识自动从KeyVault拉取必要权限凭证
- 直接从受托管标识授权的安全存储(如加密Blob存储)拉取引导脚本并执行,全程无需在模板中硬编码或传递明文凭据
这种方式既符合内部安全政策,又实现了自动化的VM引导流程,比Base64编码的临时方案更具可维护性和扩展性。
内容的提问来源于stack exchange,提问作者ZakiMa
相关产品推荐
相关产品推荐

