如何在DevOps Pipeline中开启Azure Bastion隧道?
在Azure DevOps Pipeline中集成Azure Bastion隧道实现私有VM操作
完全可以实现,核心是让阻塞式的az network bastion tunnel命令后台运行,避免卡住Pipeline,完成SSH/SCP操作后再主动终止隧道进程。以下是具体落地步骤:
1. 前置环境检查
- Azure CLI:Azure DevOps的Ubuntu/macOS托管代理默认已预装,Windows代理可通过
Azure CLI Installer任务快速安装 - 权限配置:Pipeline使用的服务连接需拥有Azure Bastion、目标VM所在资源组的
Network Contributor或对应操作权限
2. 后台启动Bastion隧道
通过后台执行命令+记录进程ID的方式,让隧道在后台运行,同时预留时间让连接建立:
Linux/macOS代理脚本示例
# 启动隧道并后台运行,将进程ID写入临时文件 az network bastion tunnel --name <Bastion实例名> --resource-group <资源组名> --target-resource-id <目标VM资源ID> --resource-port 22 --port 2222 & echo $! > bastion_tunnel.pid # 等待隧道建立(根据网络情况调整时长,建议5-15秒) sleep 10
Windows代理PowerShell示例
# 启动隧道并后台运行,捕获进程ID存入文件 Start-Process az -ArgumentList "network bastion tunnel --name <Bastion实例名> --resource-group <资源组名> --target-resource-id <目标VM资源ID> --resource-port 22 --port 2222" -NoNewWindow -PassThru | Select-Object -ExpandProperty Id | Out-File -FilePath bastion_tunnel.pid # 等待连接建立 Start-Sleep -Seconds 10
3. 执行SSH/SCP操作
隧道建立后,通过本地映射端口(示例中为2222)连接私有VM:
SSH远程执行命令(Linux/macOS)
# 单条命令执行 ssh -p 2222 <VM用户名>@localhost "sudo apt update && sudo apt upgrade -y" # 交互式操作(Pipeline中一般用非交互式命令) ssh -p 2222 <VM用户名>@localhost
SCP文件传输(Linux/macOS)
# 上传本地文件到VM scp -P 2222 ./local_deploy_package.tar.gz <VM用户名>@localhost:/opt/app/ # 从VM下载日志文件 scp -P 2222 <VM用户名>@localhost:/var/log/app.log ./local_logs/
Windows PowerShell的SSH/SCP操作
需确保代理已安装OpenSSH客户端,命令格式类似:
scp -P 2222 .\local_config.json <VM用户名>@localhost:C:\app\config\
4. 终止隧道进程
操作完成后必须杀掉隧道进程,避免占用Pipeline资源:
Linux/macOS示例
kill $(cat bastion_tunnel.pid) rm bastion_tunnel.pid
Windows PowerShell示例
$pid = Get-Content bastion_tunnel.pid Stop-Process -Id $pid -Force Remove-Item bastion_tunnel.pid
关键注意事项
- 端口冲突:提前检查代理上的本地端口(如2222)是否被占用,可选择随机端口或通过命令动态检测可用端口
- 密钥认证:若VM使用SSH密钥登录,需将私钥通过Pipeline安全变量组或安全文件存储,执行SSH时指定
-i <密钥路径>参数 - 失败处理:可添加隧道连通性检测(如
nc -zv localhost 2222),避免后续操作因隧道未建立而失败
内容的提问来源于stack exchange,提问作者JGoodgive
相关产品推荐
相关产品推荐

