我正在使用Powershell自动设置我的Azure环境 - 创建存储帐户,数据库,网站等。
在开发过程中,我想要提供和拆除很多东西。通常,我想运行我的配置脚本并创建一个天蓝色资产(如果它尚不存在)
然而,我还没有找到一种优雅的方式。如果项目不存在,某些“获取”cmdlet会抛出异常,并且捕获它有点像黑客:
try {
$storageAcct = Get-AzureStorageAccount -StorageAccountName $Name
Write-Verbose "Storage Account already exists"
} catch {
$storageAcct = New-AzureStorageAccount -StorageAccountName $Name -Location $Location
}
更重要的是,有些命令,我根本无法捕捉到异常,我不知道为什么:
try {
$cache = Get-AzureRedisCache -ResourceGroupName $resourceGroupName -Name $cacheName
} catch {
//Even with an exception, never arrives here.
}
有更好的方法吗?
答案 0 :(得分:4)
您应该使用 Test-AzureName 代替Get-AzureStorageAccount。
if (!Test-AzureName -Storage $Name)
{
# create the storage account.
}
这也适用于云服务,Web应用程序和服务总线命名空间。对于您的数据库,您将不得不采用现有方法。
**
**
对于v2资源(ARM),故事大致相同。例如,v1或v2存储帐户的DNS名称将相同,例如contoso.blob.core.windows.net
。对于Azure Web Apps(以前称为Azure Web站点)也是如此,您将拥有诸如contoso.azurewebsites.net
之类的DNS名称。换句话说,Test-AzureName
对于ARM中的这些资源也同样有用。
一个值得注意的差异是虚拟机的DNS名称。在v1中,虚拟机包含在云服务中,并获取DNS名称,例如contoso.cloudapp.net
。对于v2虚拟机,公共DNS名称由公共IP地址资源提供,其中美国东部(例如)的虚拟机的DNS名称将为contoso.eastus.cloudapp.azure.com
。要测试此DNS名称的可用性,您应使用 Test-AzureRmDnsAvailability cmdlet。例如,
if (Test-AzureRmDnsAvailability -DomainNameLabel "contos0" -Location "East US")
{
# Assign DNS name to Public IP Address resource here.
}
答案 1 :(得分:2)
试试这个:
if(!(Get-AzureRmStorageAccountNameAvailability -Name $storageName))
{
New-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -Name $storageName -SkuName Standard_LRS
}
答案 2 :(得分:1)
我通常会选择以下内容(适用于Azure中的几乎所有资源,只需替换“获取”模块和参数即可):
function Test-AzureStorageAccountExists {
Param(
[string]$resourceGroupName,
[string]$storageAccountName
)
$SA = Get-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -ErrorVariable notPresent -ErrorAction SilentlyContinue
if ($notPresent) {return $false}
}
答案 3 :(得分:0)
这样的事情?
if(
Get-AzureStorageAccount | Where {$_.Label -match $name} | measure |select -expand count -eq 0) {
$storageAcct = New-AzureStorageAccount -StorageAccountName $Name -Location $Location
}
答案 4 :(得分:0)
也许您可以使用cmdlet Get-AzureRmResource。如果资源存在,则返回有关指定资源的信息,包括资源类型;如果没有,则返回$ null。 例如。:
$MyRes=Get-AzureRmResource -ResourceName "MyResourceName" -ResourceGroupName
"MyResourceGroupName"
if ($null == $MyRes) {
# Not existing
}
答案 5 :(得分:0)
在确定是否需要创建变量之前,我需要使用Get-AzureRmAutomaitonVariable检查Azure自动化帐户中是否存在变量。 user888734使用“捕获”的解决方案帮助我解决了这个问题,该问题我被封锁了两天:-)
try {
$existingVariable = Get-AzureRMAutomationVariable -ResourceGroupName $resourceGroup -AutomationAccountName $automationAccountName -Name $variable
} catch {
New-AzureRmAutomationVariable -ResourceGroupName $resourceGroup -AutomationAccountName $automationAccountName -Name $variable -Value $value -Encrypted $False
}
答案 6 :(得分:0)
这是我使用新的Azure PowerShell Az模块的解决方案
$StorageAccountName = "Storage account name"
$ResourceGroupName = "Resource group name"
$StorageAccount = Get-AzStorageAccount -Name $StorageAccountName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue
if($StorageAccount -eq $null){
$storage = New-AzStorageAccount -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -Location "westeurope" -SkuName Standard_LRS -Kind StorageV2
}
else{
Write-Host "$StorageAccountName already exist"
}