Azure Powershell - 检查资源是否存在

时间:2015-05-06 12:21:22

标签: powershell azure azure-powershell

我正在使用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.
}

有更好的方法吗?

7 个答案:

答案 0 :(得分:4)

您应该使用 Test-AzureName 代替Get-AzureStorageAccount。

if (!Test-AzureName -Storage $Name)
{
   # create the storage account.
}

这也适用于云服务,Web应用程序和服务总线命名空间。对于您的数据库,您将不得不采用现有方法。

**

添加了以下内容以解决有关v2(ARM)资源的问题:

**

对于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"
}
相关问题