使用Powershell在Azure网站中添加虚拟目录

6
有没有一种使用Powershell向Azure网站添加虚拟目录的方法?
背景:我们有一个包含ASP.Net MVC应用程序和Web.API项目的单个解决方案。我们将应用程序发布到Azure网站的根目录下,将Web.API发布到其下的虚拟目录中。
只要在Azure门户手动添加虚拟目录,这就可以正常工作。(由于某种原因,项目设置不会传播到网站设置中。)
由于我们正在寻求自动化部署过程,因此我们希望使用Powershell脚本添加缺失的虚拟目录。

你是否找到了答案? - Ben Finkel
1
@w69rdy有最棒的答案! - Christian Droulers
4个回答

4

我最近一直在努力做这件事,找到了一个更简单的解决方案在这里

 $website = Get-AzureRmWebApp -Name "myWebApp" -ResourceGroupName "myResourceGroup" 
 $VDApp = New-Object Microsoft.Azure.Management.WebSites.Models.VirtualApplication 
 $VDApp.VirtualPath = "/TEST" 
 $VDApp.PhysicalPath = "site\\TEST" 
 $VDApp.PreloadEnabled ="YES" 
 $website.siteconfig.VirtualApplications.Add($VDApp) 
 $website | Set-azureRmWebApp 

我尝试在我的Azure发布管道的内联PowerShell脚本中使用这个解决方案,但是遇到了错误(更多细节请参见下面的响应),直到我将所有的AzureRM命令映射到Az命令,然后事情开始正常工作。感谢@iain-ward提供的起点。 - Moiz Tankiwala

4

1
基于Ben的答案:
$props = @{
    "virtualApplications" = @(
        @{
            "virtualPath"  = "/";
            "physicalPath" = "site\wwwroot";
        },
        @{
            "virtualPath"  = "/SOME_VIRTUAL_PATH";
            "physicalPath" = "site\wwwroot";
        }
    )
}

Set-AzureRmResource `
    -ResourceGroupName $resourceGroupName `
    -ResourceType "Microsoft.Web/sites/config" `
    -ResourceName "$appServiceName/web" `
    -PropertyObject $props `
    -ApiVersion "2015-08-01" `
    -Force

0

我们遇到了与@divineops在问题中描述的类似情况,但我们希望每次构建应用程序(Angular + asp.net web api)时创建一个新的虚拟目录,以便可以测试多个应用程序版本,每个版本都位于其自己的版本化虚拟目录中。

因此,我们需要powershell脚本在devops运行发布管道时每次创建虚拟目录。

在设置由@iain-ward提供的脚本时,我们首先在Azure DevOps发布管道中遇到了一个错误,告诉我们要运行Login-AzureRmAccount命令。

在使用必要参数(即凭据)运行此命令后,我们得到了下一个错误:

Method 'get_SerializationSettings' in type 'Microsoft.Azure.Management.WebSites.WebSiteManagementClient' from assembly 'Microsoft.Azure.Management.Websites, Version=1.0.0.2, Culture=neutral, PublicKeyToken=31bf3856ad364e35' does not have an implementation.

为了解决这个错误,我最终将所有的AzureRm命令转换为Az命令,并且以下是最终成功完成从DevOps发布管道中创建虚拟目录任务的脚本:
$UserName = "<email>"
$Password = ConvertTo-SecureString "<password>" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($UserName, $Password)
Login-AzAccount -Credential $Credential -SubscriptionName "<subscriptionName>" -TenantId "<tenantGuid>"
$website = Get-AzWebApp -Name "<appServiceName>" -ResourceGroupName "<resourceName>" 
$VDApp = New-Object Microsoft.Azure.Management.WebSites.Models.VirtualApplication 
$VDApp.VirtualPath = "/<virtualDirectory>" 
$VDApp.PhysicalPath = "site\\wwwroot\\<physicalPath>" 
$VDApp.PreloadEnabled ="NO" 
$website.siteconfig.VirtualApplications.Add($VDApp) 
$website | Set-AzWebApp 

在“<>”中的所有项都是占位符,您需要用与您的帐户相关的值替换它们。 注意-我必须指定租户ID和订阅ID,因为我的帐户关联了多个,并且脚本无法选择将哪个设置为当前脚本会话的当前。

参考文献-基于这篇文章,我决定将所有AzureRm命令映射到Az命令,因为AzureRm已经过时了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接