Azure Pipeline Linux代理无法解析Azure Private Link问题求助
以下是针对Azure Pipeline代理解析SQL Server公网IP问题的排查和解决步骤:
对比代理与登录用户的DNS环境变量
虽然两种场景下nslookup都指向127.0.0.53,但Pipeline代理进程可能继承了不同的DNS配置。分别在直接登录虚拟机和代理运行时执行printenv | grep DNS,对比RES_OPTIONS、DNS_SERVERS等变量是否一致。如果代理的DNS配置包含公网服务器,需修改代理启动脚本,强制指定VNet的Azure DNS服务器(通常为VNet地址空间的第4个IP,如10.0.0.4)。手动添加hosts映射强制私有IP解析
在虚拟机的/etc/hosts文件中添加SQL Server的FQDN与私有IP的映射,示例:10.1.0.10 your-sql-server-name.database.windows.net该配置会跳过DNS查询,直接使用指定的私有IP,确保代理进程能正确解析。
检查代理服务的systemd配置
如果Azure Pipeline代理以systemd服务运行,其运行上下文的DNS配置可能独立于登录用户。编辑代理的systemd服务文件(通常路径为/etc/systemd/system/azure-pipelines-agent.service),在[Service]段添加环境变量指定VNet DNS:Environment="RES_OPTIONS=server:10.0.0.4"执行以下命令重载并重启服务:
sudo systemctl daemon-reload && sudo systemctl restart azure-pipelines-agent验证systemd-resolved的配置一致性
在两种场景下分别执行resolvectl status,确认DNS服务器列表、搜索域等配置是否一致。如果代理运行时的DNS服务器包含公网地址(如8.8.8.8),说明服务未正确使用VNet内部DNS,需通过上述步骤强制修正。
错误示例(翻译后):
Invoke-Sqlcmd -ConnectionString $Con -query "SELECT DB_ … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 原因:建立与SQL Server的连接时发生特定于实例的错误。由于“拒绝公共网络访问”设置为“是”,连接被拒绝。
内容的提问来源于stack exchange,提问作者Rogue101

