如何为 Azure Web 应用程序自动安装特定站点扩展

How to automatically install specific Site Extensions for Azure Web Apps

理想情况下,我想在我的应用程序代码或 .deployment 文件中声明,当我的代码被推送到 scm Kudu 站点时,要安装或更新特定的站点扩展。这可能吗?

具体来说,我希望 Microsoft.ApplicationInsights.AzureWebSites 站点扩展自动安装为我部署的所有站点的一部分,而无需手动浏览到 scm 站点并从库中安装它。

您不能将站点扩展安装为 Kudu git 部署的一部分,但您可以将其作为 ARM 模板的一部分进行安装。您可以找到完整的样本 here.

这与任何其他站点配置基本相同。例如设置应用程序设置、应用程序服务层、打开日志记录、WebSockets……所有这些都在 Kudu 部署之外,但可以使用具有所有所需站点状态的 ARM 模板来实现。

另一个方法是制作一个可以创建 SiteExtension 文件夹的 WebJob,然后将您的 SiteExtension 文件复制到该文件夹​​中。作为部署的一部分,您只需包含网络作业。

我们对如何将 Stackify APM 从站点扩展安装到 Azure Web Apps 进行了类似的操作。站点扩展创建一个 WebJob,WebJob 实际上根据某些条件项更新站点扩展 applicationHost 转换。

可以使用 powershell 完成,但有点老套(例如使用名为 staging 的暂存槽):

Write-Host "Setting appsettings for Stackify on $AzureWebSite"

$hash = @{}
$hash['Stackify.ApiKey'] = "$licenceKey"
$hash['Stackify.Environment'] = "$environment"
$hash['Stackify.AppName'] = "$BaseWebAppName"

if ($loadCertificates -eq 'True')
{
    $hash['WEBSITE_LOAD_CERTIFICATES'] = "*"
}

Set-AzureWebsite -Name $AzureWebSite -Slot staging -AppSettings $hash

### Install Extension for Azure App###
Write-Host "Installing Stackify on $AzureWebSite"
$Kudu = "https://" + $AzureWebSite + "-staging.scm.azurewebsites.net/api/extensionfeed" # Here you can get a list for all Extensions available.
$InstallNRURI = "https://" + $AzureWebSite + "-staging.scm.azurewebsites.net/api/siteextensions" # Install API EndPoint

$slot = Get-AzureWebsite $AzureWebSite -Slot staging 
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $slot.PublishingUsername,$slot.PublishingPassword))) 
$invoke = Invoke-RestMethod -Uri $Kudu -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method get ###-InFile $filePath -ContentType "multipart/form-data" 
$id = ($invoke | ? {$_.id -match "stackify*"}).id  ### Searching for Stackify ID Extension

try {
    $InstallStackify = Invoke-RestMethod -Uri "$InstallNRURI/$id" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method Put
    $Status = ($InstallStackify.provisioningState).ToString() + "|" + ($InstallStackify.installed_date_time).ToString()  ### Status
    Write-Output "Stackify Installation Status : $Status"
}
catch{$_}
Restart-AzureWebsite $AzureWebSite -Slot staging