无法从 Azure 管道连接到 Azure 数据库
我已经设置了 Azure Database for MySQL。我能够使用 Azure Cloud Shell 顺利连接
mysql -h ...mysql.database.azure.com --ssl -u web -p
现在我想要做的是从 Azure 管道连接到此数据库。目的是使用数据库跟踪我们工件的版本号。
我的初始测试管道 yaml 如下所示
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- checkout: none
- bash: |
mysql -h ...mysql.database.azure.com -u web -p -D applications -N -e "select version, snapshot from releases where name='$1'" | while IFS= read -r value
do
echo $value
done
但是,bash 脚本从未完成。指示器只是旋转,我还没有收到超时或任何类型的错误。
由于数据库设置为使用 SSL,我的下一个管道迭代如下所示
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- checkout: none
- bash: |
mysql -h ...mysql.database.azure.com --ssl -u web -p -D applications -N -e "select version, snapshot from releases where name='$1'" | while IFS= read -r value
do
echo $value
done
它反映了我在 Cloud Shell 中使用的相同连接。但是这次我收到以下输出
Starting: Bash
==============================================================================
Task : Bash
Description : Run a Bash script on macOS, Linux, or Windows
Version : 3.182.0
Author : Microsoft Corporation
Help : https://learn.microsoft.com/azure/devops/pipelines/tasks/utility/bash
==============================================================================
Generating script.
========================== Starting Command Output ===========================
/usr/bin/bash --noprofile --norc /home/vsts/work/_temp/b5b259c5-bee8-4e95-b1c6-50a98baaf7dc.sh
mysql: [ERROR] unknown option '--ssl'.
Finishing: Bash
最后,我尝试下载推荐的证书并将其添加到连接
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- checkout: none
- task: DownloadSecureFile@1
inputs:
secureFile: DigiCertGlobalRootG2.crt.pem
- bash: |
mysql -h ...mysql.database.azure.com --ssl_cert $(Agent.TempDirectory)/DigiCertGlobalRootG2.crt.pem -u web -p -D applications -N -e "select version, snapshot from releases where name='$1'" | while IFS= read -r value
do
echo $value
done
这再次导致任务只是停留在那里而没有输出。我不确定这是否是防火墙问题(意味着我需要向数据库防火墙设置添加规则)?如果是这种情况,那么我如何确定允许的 IP 地址范围?
顺便说一句,我已经设置了以下规则
{
"endIpAddress": "55.226.19.255",
"id": "/subscriptions/1fa96361-56c7-4090-8823-26ae03e4c38d/resourceGroups/VS-americas-manufacturing-Group/providers/Microsoft.DBforMySQL/servers/mfg-mysql-eus-1/firewallRules/cloudshell",
"name": "cloudshell",
"resourceGroup": "VS-americas-manufacturing-Group",
"startIpAddress": "52.226.19.0",
"type": "Microsoft.DBforMySQL/servers/firewallRules"
}
但这似乎不适用于管道。
那么我需要在服务器或管道上进行哪些设置更改才能使其正常工作?
万一有人遇到与我相同的问题并找到了这篇文章……
建议的解决方案之一是使用 yaml-task AzureMysqlDeployment@1 部署 ef 迁移脚本。但它给出了错误:
“错误:MySQL 服务器列表为空。MySQL 服务器主机名无效。”
根据 微软关于管道任务的文档 ,该任务(目前)似乎仅适用于 Azure 上的 mysql 单服务器数据库。 Azure 建议为所有新开发创建一个灵活的服务器 mysql 数据库,我这样做了,因此它在我的案例中不起作用。
相反,我通过使用命令行任务并运行 mysql 命令来使其工作
- task: CmdLine@2
displayName: Run SQL Scripts in MySQL database
inputs:
script: 'mysql --host=$(mysql-server) --user=$(mysql-user) //
--password=$(mysql-password) -D $(mysql-database-name) //
--execute="source path/to/script.sql"'
如果您想运行脚本并对 Azure Database for MySQL 中的数据库进行更改。您可以使用 Azure Database for MySQL 部署任务 :
# Azure Database for MySQL deployment
# Run your scripts and make changes to your Azure Database for MySQL
- task: AzureMysqlDeployment@1
inputs:
ConnectedServiceName: # Or alias azureSubscription
ServerName:
#DatabaseName: # Optional
SqlUsername:
SqlPassword:
#TaskNameSelector: 'SqlTaskFile' # Optional. Options: SqlTaskFile, InlineSqlTask
#SqlFile: # Required when taskNameSelector == SqlTaskFile
#SqlInline: # Required when taskNameSelector == InlineSqlTask
#SqlAdditionalArguments: # Optional
#IpDetectionMethod: 'AutoDetect' # Options: AutoDetect, IPAddressRange
#StartIpAddress: # Required when ipDetectionMethod == IPAddressRange
#EndIpAddress: # Required when ipDetectionMethod == IPAddressRange
#DeleteFirewallRule: true # Optional