通过Azure Runbook在指定Azure VM启动控制台应用的问题求助
我来一步步帮你理清这些问题,毕竟从开发环境的Hybrid Worker切换到生产环境的Azure VM执行,确实有几个容易踩的坑:
1. 先解决Connect-AzureRmAccount未识别和找不到exe的问题
首先,AzureRm是旧版Azure PowerShell模块,现在Azure自动化默认推荐用Az模块,而且自动化沙盒环境里大概率没预装AzureRm。另外你在开发环境能找到myconsoleapp.exe,是因为这个exe就在Hybrid Worker机器的本地路径,但如果Runbook在Azure自动化沙盒里运行,沙盒是完全隔离的环境,根本访问不到你目标VM里的本地文件。
这里核心要明确:如果你想在指定Azure VM本地执行exe,要么把这个VM配置成Hybrid Worker(和开发环境模式一致),要么用远程执行命令的方式直接在VM内运行;如果坚持用沙盒Runbook,那exe得放到沙盒能访问的存储账户里,下载到临时目录再执行——但这显然不是你要的“在指定VM上执行”的效果。
2. 关于“需将exe执行命令放入InlineScript”的提示
这个提示一般出现在你使用PowerShell工作流Runbook时,因为工作流有专属语法规则,普通可执行文件调用不属于工作流原生命令,必须用InlineScript块包裹。如果觉得麻烦,直接改用普通PowerShell Runbook(非Workflow类型),就不需要套InlineScript,直接写命令就行。
3. 如何关联到指定Azure VM执行应用
这里给你两种常用方案,按需选择:
方案一:把目标VM配置为Hybrid Worker(和开发环境一致)
这是最贴近你开发环境的方式,步骤如下:
- 在目标Azure VM上安装Hybrid Worker代理,将其加入一个Hybrid Worker组
- 在自动化账户创建Runbook时,指定这个Hybrid Worker组作为执行目标
- 此时Runbook会直接在该VM上运行,你可以直接调用VM本地路径的
myconsoleapp.exe;如果需要操作Azure资源,用托管身份登录即可,不用再用Connect-AzureRmAccount
示例脚本(普通PowerShell Runbook,在Hybrid Worker上运行):
# 用自动化账户托管身份登录Azure(如需操作Azure资源) Connect-AzAccount -Identity # 直接执行VM本地的控制台应用(替换为你的exe实际路径) & "C:\Apps\myconsoleapp.exe"
方案二:用Invoke-AzVMCommand远程执行VM内命令
如果不想配置Hybrid Worker,可以用这个命令直接远程到VM执行,前提是VM已开启WinRM(Azure VM默认开启),且自动化账户拥有该VM的访问权限:
示例脚本:
# 用托管身份登录Azure Connect-AzAccount -Identity # 定义VM信息 $vmName = "你的VM名称" $resourceGroupName = "你的资源组名称" # 调用自动化资产里存储的VM本地管理员凭据 $vmCredential = Get-AutomationPSCredential -Name "VM本地管理员账户" # 远程执行控制台应用 Invoke-AzVMCommand -ResourceGroupName $resourceGroupName -VMName $vmName ` -CommandToRun "& 'C:\Apps\myconsoleapp.exe'" ` -Credential $vmCredential
注意:你需要提前在自动化账户的“资产”页面添加VM本地管理员的凭据,否则远程登录会失败。
额外提醒
- 彻底放弃
AzureRm模块,全部切换为Az模块:自动化账户可在“模块”页面安装Az模块;如果是Hybrid Worker,直接在VM上运行Install-Module Az完成安装 - 无论用哪种方案,调用exe时务必使用绝对路径,避免相对路径导致的文件找不到问题
内容的提问来源于stack exchange,提问作者macm

