Azure应用服务槽交换后如何直接修改web.config参数值?
解决方案
一、修改web.config的两种常用方法
方法1:用Azure应用设置覆盖(推荐,不用改文件)
如果是ASP.NET应用,Azure App Service的应用设置会自动覆盖web.config里<appSettings>或<connectionStrings>节点的值,优先级比文件本身高,这种方式不用碰web.config文件,安全还方便管理:
- 在槽交换任务后加一个
AzureAppServiceSettings@1任务,直接更新目标槽的配置:
- task: AzureAppServiceSettings@1 inputs: azureSubscription: 'subscrip1' appName: 'xxx-one-swapslottest-67' resourceGroupName: 'xxx-one-rgtest-67' slotName: 'production' # 交换后的目标槽,这里填生产槽 appSettings: | [ { "name": "你的配置键名", "value": "新的配置值", "slotSetting": false # 要让这个配置只对当前槽生效,就改成true } ] # 如果要改连接字符串,加下面的参数 connectionStrings: | [ { "name": "你的连接字符串键名", "value": "新的连接字符串", "type": "SQLAzure", "slotSetting": false } ]
方法2:通过Kudu API直接修改web.config文件
如果必须改web.config里非应用设置的节点(比如system.web下的参数),可以用Kudu的REST API配合PowerShell远程操作:
- 先拿Kudu的访问凭据,下载web.config改完再传回去,直接加个Azure PowerShell任务就行:
- task: AzurePowerShell@5 inputs: azureSubscription: 'subscrip1' ScriptType: 'InlineScript' Inline: | # 定义参数 $resourceGroupName = "xxx-one-rgtest-67" $webAppName = "xxx-one-swapslottest-67" $slotName = "production" # 目标槽名称 # 获取Kudu发布凭据 $publishingCredentials = Get-AzWebAppPublishingProfile -ResourceGroupName $resourceGroupName -Name $webAppName -Slot $slotName -OutputFile "publishprofile.xml" -Format WebDeploy $xmlContent = [xml](Get-Content "publishprofile.xml") $userName = $xmlContent.publishData.publishProfile[0].userName $password = $xmlContent.publishData.publishProfile[0].userPWD # 构建Kudu API地址 $kuduApiUrl = "https://$webAppName`-$slotName.scm.azurewebsites.net/api/vfs/site/wwwroot/web.config" # 生成认证头 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $userName, $password))) $headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)} # 下载当前web.config $webConfigContent = Invoke-RestMethod -Uri $kuduApiUrl -Headers $headers -Method Get # 修改配置,比如把compilation的debug改成false $webConfigXml = [xml]$webConfigContent $webConfigXml.configuration.system.web.compilation.debug = "false" $updatedContent = $webConfigXml.OuterXml # 上传修改后的文件 Invoke-RestMethod -Uri $kuduApiUrl -Headers $headers -Method Put -Body $updatedContent -ContentType "application/xml" azurePowerShellVersion: 'LatestVersion'
二、解决PowerShell任务路径不存在的问题
出现这个问题是因为Pipeline代理的本地文件系统和Azure App Service的远程文件系统完全不搭边,你不能用本地路径去访问应用服务的文件。解决办法就是用Kudu API或者Azure官方的cmdlet远程操作,上面的方法2已经用Kudu API实现了远程修改,另外也可以用Azure CLI任务:
- task: AzureCLI@2 inputs: azureSubscription: 'subscrip1' scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | # 用az命令修改应用服务配置(部分配置支持直接用这个命令改) az webapp config set --resource-group xxx-one-rgtest-67 --name xxx-one-swapslottest-67 --slot production --php-version 7.4 # 示例:修改PHP版本,对应web.config里的配置
内容的提问来源于stack exchange,提问作者devopsseeker
相关产品推荐
相关产品推荐

