如何通过Azure Runbook调用存储账户PS脚本执行VMSS命令并解决找不到文件报错
问题解决方案:Azure Runbook调用Invoke-AzVmssVMRunCommand提示Could not find file错误
错误原因
Invoke-AzVmssVMRunCommand的-ScriptPath参数读取的是当前命令执行环境本地的文件:
- 你在CloudShell中执行时,CloudShell默认已经将关联存储账户的文件共享挂载到了本地
$Home路径,所以可以直接读取到script.ps1 - Runbook运行在Azure Automation的独立沙箱环境中,默认没有挂载你的存储账户文件共享,自然找不到对应路径下的脚本文件
可行解决方案
方案1:脚本内容直接内嵌(脚本体积较小时首选)
不用-ScriptPath参数,改用命令支持的-Script参数直接传入脚本内容,无需额外下载文件:
# 此处替换为你script.ps1文件内的完整代码 $customScript = @' Write-Output "脚本执行开始" # 你的原有脚本逻辑 Write-Output "脚本执行完成" '@ Invoke-AzVmssVMRunCommand -ResourceGroupName $ResourceGroupName -VMScaleSetName $VirtualMachineScaleSetName -InstanceId $vminstances -CommandId 'RunPowerShellScript' -Script $customScript
方案2:Runbook中先下载存储账户脚本再执行(脚本需动态更新时使用)
先在Runbook中将存储账户里的脚本下载到沙箱的临时目录,再调用执行命令:
# 1. 获取存储账户上下文,建议将存储密钥存在Automation加密变量中,不要硬编码 $storageAccountName = "你的存储账户名称" $storageKey = Get-AzAutomationVariable -ResourceGroupName "Automation账户资源组名" -AutomationAccountName "你的Automation账户名" -Name "存储账户密钥变量名" -AsPlainText $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey # 2. 下载脚本到Runbook沙箱临时目录,替换为你实际的文件共享名、脚本存储路径 Get-AzStorageFileContent -ShareName "CloudShell关联的文件共享名" -Path ".cloudconsole/script.ps1" -Destination "$env:TEMP\script.ps1" -Context $storageContext # 3. 调用执行命令,指向临时目录的脚本文件 Invoke-AzVmssVMRunCommand -ResourceGroupName $ResourceGroupName -VMScaleSetName $VirtualMachineScaleSetName -InstanceId $vminstances -CommandId 'RunPowerShellScript' -ScriptPath "$env:TEMP\script.ps1"
注意事项
- 确保Runbook使用的托管身份同时拥有存储账户的存储文件数据读取者权限,以及虚拟机规模集的虚拟机参与者权限
- 保持Runbook中Az.Compute模块版本与你CloudShell测试时的版本一致,避免参数兼容问题
- 若使用方案2,需准确填写脚本在存储文件共享中的实际路径,CloudShell默认
$Home对应文件共享下的.cloudconsole目录
内容的提问来源于stack exchange,提问作者UDIT JOSHI
相关产品推荐
相关产品推荐

