Azure DevOps发布管道部署带私有终结点的Azure SQL失败求助
问题分析与解决方案
核心问题原因
你遇到的No such host is known错误,根源在于Azure SQL Server配置了私有终结点后,其公网DNS域名(xxxx.database.windows.net)不会解析到公网IP,而是被Azure私有DNS重定向到私有终结点的私网IP。此时你的VMSS代理池即使把公网IP加入SQL防火墙,也无法通过公网访问SQL Server——因为公网根本找不到这个主机地址。
分步解决方案
1. 确保代理与SQL私有终结点的网络连通
- 确认你的VMSS代理池所在的虚拟网络(VNet),与Azure SQL私有终结点所在的VNet处于同一网络环境:
- 要么直接在同一个VNet
- 要么通过VNet对等互联、VPN网关或ExpressRoute实现VNet间连通
- 只有代理能通过私网访问到SQL的私有终结点,才能建立连接。
2. 移除无效的公网IP防火墙配置
你的DACPAC任务中配置的IpDetectionMethod、StartIpAddress、EndIpAddress都是针对公网访问SQL Server的场景,在私有终结点环境下完全无用,直接移除这些配置项:
steps: - task: SqlAzureDacpacDeployment@1 displayName: 'Azure SQL DacpacTask' inputs: azureSubscription: 'zzzzz' AuthenticationType: aadAuthenticationPassword ServerName: '$(ServerName)' DatabaseName: '$(DatabaseName)' aadSqlUsername: '$(UserName)' aadSqlPassword: '$(Password)' DacpacFile: '$(System.DefaultWorkingDirectory)/xxxx/drop_db/DB.dacpac' AdditionalArguments: '/p:IgnoreAnsiNulls=True /p:IgnoreComments=False /p:BlockOnPossibleDataLoss=True /p:GenerateSmartDefaults=True /p:DropObjectsNotInSource=False /p:UnmodifiableObjectWarnings=False /p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions' # 移除以下无效的公网防火墙配置 # IpDetectionMethod: IPAddressRange # StartIpAddress: '$(AgentIP)' # EndIpAddress: '$(AgentIP)'
3. 删除无用的公网IP获取任务
既然不需要代理的公网IP了,直接删除那个获取AgentIP的AzurePowerShell任务,以及对应的AgentIP变量:
# 移除以下无效任务 # steps: # - task: AzurePowerShell@5 # displayName: 'Azure PowerShell : Get Agent Public IP' # inputs: # azureSubscription: 'zzzzzz' # ScriptType: InlineScript # Inline: | # $ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content # Write-Host $ip # Write-Host "##vso[task.setvariable variable=AgentIP;]$ip" # azurePowerShellVersion: LatestVersion variables: ServerName: 'xxxx.database.windows.net' DatabaseName: 'yyyy' UserName: 'xyz@abc.com' # 移除无效变量 # AgentIP: ''
4. 验证DNS解析正确性
- 确保VMSS所在VNet关联了Azure私有DNS区域
privatelink.database.windows.net:- 这个私有DNS区域会把
xxxx.database.windows.net解析到SQL私有终结点的私网IP - 如果没有关联,VMSS代理可能无法正确解析SQL服务器地址,依然会报找不到主机的错误
- 这个私有DNS区域会把
5. 确认SQL防火墙的必要配置
- 保留“允许Azure服务和资源访问此服务器”选项即可,这个配置在私有终结点场景下,允许Azure内部资源(如你的VMSS代理)通过私网访问SQL Server
- 不需要添加任何公网IP的防火墙规则,因为私有终结点已经阻断了公网访问路径
最终有效任务配置示例
variables: ServerName: 'xxxx.database.windows.net' DatabaseName: 'yyyy' UserName: 'xyz@abc.com' steps: - task: SqlAzureDacpacDeployment@1 displayName: 'Azure SQL DacpacTask' inputs: azureSubscription: 'zzzzz' AuthenticationType: aadAuthenticationPassword ServerName: '$(ServerName)' DatabaseName: '$(DatabaseName)' aadSqlUsername: '$(UserName)' aadSqlPassword: '$(Password)' DacpacFile: '$(System.DefaultWorkingDirectory)/xxxx/drop_db/DB.dacpac' AdditionalArguments: '/p:IgnoreAnsiNulls=True /p:IgnoreComments=False /p:BlockOnPossibleDataLoss=True /p:GenerateSmartDefaults=True /p:DropObjectsNotInSource=False /p:UnmodifiableObjectWarnings=False /p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions'
内容的提问来源于stack exchange,提问作者Ajay Meda
相关产品推荐
相关产品推荐

