我想在我的 Azure 部署中部署不同的 VM 大小,具体取决于目标云服务(例如,我希望在生产中使用更大的实例,但在测试中可以使用较小的实例)。在 Visual Studio 2010 中,所有服务配置的大小必须相同。
是否有解决方法,或者这就是它的方式?
我想在我的 Azure 部署中部署不同的 VM 大小,具体取决于目标云服务(例如,我希望在生产中使用更大的实例,但在测试中可以使用较小的实例)。在 Visual Studio 2010 中,所有服务配置的大小必须相同。
是否有解决方法,或者这就是它的方式?
我发现最好的解决方法是拥有两个不同的云项目。所以基本上你只需创建两个不同的云项目,将所有相同的角色添加到每个项目中,但每个项目都有不同的配置。每次更改时,您只需要小心更新这两个地方的所有配置。正如 Brent the Programming Simian 已经提到的那样,这相当于拥有两个 CSDEF,这只是实现这一目标的具体方法。
这也为您提供了其他方面的灵活性。例如,您可以拥有一个同时具有 HTTP 和 HTTPS 端点的测试站点,但生产站点只能具有 HTTPS。
VM 大小在服务定义文件中声明。所以创建不同大小的云服务包需要不同的包。最终,这不是视觉工作室支持的东西。
除此之外,如果您正在创建云服务 (PaaS),我会质疑为什么需要这样做。我收到的最佳指导是运行您需要的最小 VM,并根据负载要求运行尽可能多的 VM。通过拥有更多、更小的实例,您的解决方案最终具有更大的弹性。
我进一步评论,但认为我会为我的解决方案提供 powershell。我在构建我的 CI 服务器(恰好是 TeamCity)之前运行它,但这可以在本地或 CI 上运行。
Param(
[string]$RoleType, #WebRole or WorkerRole
[string]$RoleName, #RoleName from CSDEF
[string]$VMInstanceSizeIn, #Options for VM Size: Small, Medium, Large, ExtraLarge, A6, A7
[string]$csDefPath #File path for ServiceDefinition.csdef for the cloud service project
)
$timeStampFormat = "g"
if ($VMInstanceSizeIn -eq $null) {$VMInstanceSizeIn = "Medium"}
Write-Output "$(Get-Date -f $timeStampFormat) - Setting $RoleType role type with RoleName $RoleName VM Size to $VMInstanceSizeIn in ServiceDefinition.csdef prior to building the package file."
Try
{
$csDefConfig = "$csDefPath\ServiceDefinition.csdef"
Write-Output "$(Get-Date -f $timeStampFormat) - config file location: $csDefConfig"
$csDefConfigXml = [xml](Get-Content $csDefConfig)
Write-Output "$(Get-Date -f $timeStampFormat) - Found ServiceDefinition File at $csDefConfig"
$csDefCurrentXmlNode = $csDefConfigXml.ServiceDefinition.$RoleType | where {$_.Name -eq $RoleName}
$csDefCurrentXmlNode.SetAttribute("vmsize", $VMInstanceSizeIn)
$csDefConfigXml.Save($csDefConfig)
Write-Output "$(Get-Date -f $timeStampFormat) - Successfully saved the ServiceDefinition.csdef file to $csDefConfig"
}
Catch
{
Write-Output "$(Get-Date -f $timeStampFormat) - Powershell Script Error. An error occurred while attempting to modify the ServiceDefinition.csdef file prior to building the solution."
Write-Error -ErrorRecord $_
##teamcity[buildStatus status='FAILURE' ]
exit(1)
}
请注意,在撰写本文时,我只需要处理一个 web 和 worker 角色,所以我不确定是否曾经使用多个 worker 角色进行过测试。至少应该足以让您入门。