【问题标题】:Azure: How to check storage account exists in Azure with Get-AzureStorageAccountAzure:如何使用 Get-AzureStorageAccount 检查 Azure 中是否存在存储帐户
【发布时间】:2014-08-13 09:32:43
【问题描述】:

我正在构建一个强大的 shell 脚本来自动设置 Azure 中的网站环境。该网站使用帐户存储。如果存在,我希望脚本不创建帐户存储。

我认为以这种方式使用Get-AzureStorageAccount 可能有效,但它不起作用:

Write-Verbose "[Start] creating $Name storage account $Location location"

$storageAcct = Get-AzureStorageAccount –StorageAccountName $Name
if (!$storageAcct)
{   
    $storageAcct = New-AzureStorageAccount -StorageAccountName $Name -Location $Location -Verbose
    if ($storageAcct)
    {
        Write-Verbose "[Finish] creating $Name storage account in $Location location"
    }
    else
    {
        throw "Failed to create a Windows Azure storage account. Failure in New-AzureStorage.ps1"
    }
}
else
{
    Write-Verbose "$Name storage account in $Location location already exists, skipping creation"
}

问题是我不知道如何处理Get-AzureStorageAccount的返回。

非常感谢您!

【问题讨论】:

  • 您能详细说明一下吗? “..不知道如何处理Get-AzureStorageAccount.`的返回是什么意思?发生了什么,你想发生什么?
  • 如果Get-AzureStorageAccount 没有返回我提供的名称的存储帐户,则创建存储帐户,否则跳过该步骤。

标签: powershell azure azure-storage


【解决方案1】:

试试这个:

$Name = "myStorageAccount"
$Location = "myLocation"

Write-Host "[Start] creating $Name storage account $Location location"
try{
    Get-AzureStorageAccount –StorageAccountName $Name -ErrorAction Stop | Out-Null
    Write-Host "$Name storage account in $Location location already exists, skipping creation"
    }
catch{
    Write-Host "[Finish] creating $Name storage account in $Location location"
    New-AzureStorageAccount -StorageAccountName $Name -Location $Location -Verbose      
}

【讨论】:

    【解决方案2】:

    我建议使用 Test-AzureName cmdlet 来确定它是否存在。所以,像这样。

    if (!(Test-AzureName -Storage $Name))
    {  
        Write-Host "Creating Storage Account $Name"
        New-AzureStorageAccount -StorageAccountName $Name -Location $Location 
    }
    

    您也可以将 Test-AzureName 用于其他服务,例如云服务、网站和 ServiceBus。如果存在则返回 True,否则返回 False。

    【讨论】:

      【解决方案3】:

      Test-AzureName 不适用于我们的构建代理,而且我们已经在代码中有一个 try/catch,因此第二个需要将其构建为一个函数。我选择了那个标准的 get 并检查是否为 null,使用 -ErrorAction Ignore 来阻止它抛出异常

      # Check for storage account and create if not found    
      $StorageAccount = Get-AzureRmStorageAccount -Name $StorageAccountName -ResourceGroupName $StorageAccountRG -ErrorAction Ignore
      if ($StorageAccount -eq $null)  
      {    
          New-AzureRmStorageAccount -Location "West Europe" -Name $StorageAccountName -ResourceGroupName $StorageAccountRG -SkuName Standard_LRS -Kind Storage     
          $StorageAccount = Get-AzureRmStorageAccount -Name $StorageAccountName -ResourceGroupName $StorageAccountRG   
      }
      

      【讨论】:

        【解决方案4】:

        @Rick Rainey 的解决方案在您使用 Add-AzureAccount 登录时有效。但是,Azure 和 powershell 的登录帐户套件(Windows Live 与 AD)和登录机制(经典:Add-AzureAccount;资源管理器:Login-AzureRmAccount)存在冲突和混乱。一些 Azure powershell cmdlet 需要特定的登录名;此外,有些需要特定的帐户类型!

        为了解决这个复杂、无证和令人困惑的权限问题,我们总是使用 AD 帐户,通过 Login-AzureRmAccount 登录。我们还使用 Azure 资源管理器 (ARM) 资源和 cmdlet,遵循 Microsoft 将 ARM 作为其推荐的战略方法。但是,@RIck 的解决方案是 ARM 登录不起作用的解决方案。 :-( 所以你需要另一种方法,即@Darren's(用于存储)。但是,对于Test-AzureName 的通用替代品,我建议Find-AzureRmResource。在存储的情况下

        $StorageObject = Find-AzureRmResource -ResourceType "Microsoft.Storage/storageAccounts" | Where-Object {$_.Name -eq $storageName}        
        if  ( !$StorageObject ) {
            $storageLocation = (Get-AzureRmResourceGroup -ResourceGroupName $resourceGroup).Location
            $storageType = "Standard_LRS"
            New-AzureRmStorageAccount -ResourceGroupName $resourceGroup  -Name $storageName -Location $storageLocation -Type $storageType
        }
        

        【讨论】:

          【解决方案5】:
          Get-AzureRmStorageAccountNameAvailability -Name "accountname"
          

          【讨论】:

            【解决方案6】:

            您应该使用最新的 Powershell 模块Az。

            if ($(Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName) -eq $null)
            {
                # does not exist
            }
            

            【讨论】:

              【解决方案7】:

              使用错误变量

              Get-AzStorageAccount -ResourceGroupName 'RG-QA-TEST' -Name 'staccountfor12334ff' -ErrorVariable ev1 -ErrorAction SilentlyContinue
              
              if ($ev1) {
                  Write-Host "-------------------------- Creating OEM Storage"
                  //create storage account
              }
              

              【讨论】:

              • 感谢您的回答。请考虑下次将您的代码放入代码环境中:-)
              【解决方案8】:

              我在 Octopus Deploy 中使用 Powershell 为静态网站托管设置 Azure 存储帐户 时遇到了这个挑战。

              这是我修复它的方法:

              使用Az module for Azure Powershell 我做了以下事情:

              # Define Variables
              $RESOURCE_GROUP_NAME = my-resource-group
              $LOCATION = northeurope
              $STORAGE_ACCOUNT_NAME = myapplication
              $SKU_NAME = Standard_GRS
              $STORAGE_KIND = StorageV2
              
              # Check Storage Account and Create if not Found
              $STORAGE_ACCOUNT = Get-AzStorageAccount -ResourceGroupName $RESOURCE_GROUP_NAME -Name $STORAGE_ACCOUNT_NAME -ErrorAction Ignore
              
              if ($STORAGE_ACCOUNT -eq $null)  {    
                  Write-Host 'Creating storage account'
                  New-AzStorageAccount -ResourceGroupName $RESOURCE_GROUP_NAME -AccountName $STORAGE_ACCOUNT_NAME -Location $LOCATION -SkuName $SKU_NAME -Kind $STORAGE_KIND
                  Write-Host "$STORAGE_ACCOUNT_NAME storage account successfully created"
              }
              else {
                  Write-Host "$STORAGE_ACCOUNT_NAME storage account already exists"
              }
              

              注意:

              -ErrorAction Ignore - 这将忽略存储帐户不存在时会出现的异常 Write-Host " " - 双引号用于字符串插值,因为我们正在连接字符串和变量。

              就是这样。

              我希望这会有所帮助

              【讨论】:

                【解决方案9】:

                使用当前适用于 PowerShell 版本 7 的 Az 模块,Get-AzStorageAccountNameAvailability cmdlet 可能会提供更高效的解决方案,因为它是专门为这项任务设计的。这是一个例子:

                # ... declare variables and specify values ...
                
                $checkNameAvail = (Get-AzStorageAccountNameAvailability -Name $storageAccountName) | `
                Select-Object NameAvailable
                
                if ($checkNameAvail.NameAvailable) 
                {
                  Write-Host 'Account name available! Please wait while your resource is being created'
                
                  # Create account. Variables used in this example would have been declared earlier in the script.
                  $storageAccount = (New-AzStorageAccount -ResourceGroupName $resourceGroupName `
                    -AccountName $storageAccountName `
                    -Location $location `
                    -SkuName $skuType `
                    -AllowBlobPublicAccess $false -EnableHttpsTrafficOnly $true)
                # ... 
                }
                else 
                {
                  # This section of the script executes if the name is not available
                  Write-Host "The name <$storageAccountName> is not available. Suggest a new globally unique name!"
                }
                
                

                上述条件将返回False,并执行else 语句,因为cmdlet 返回的布尔值在[0] 中,如下面的PowerShell 命令行测试所示。因此,可用性信息(布尔值)可以从 cmdlet 返回的对象中剥离,并(如本例中)用作脚本其余部分的条件。

                PS C:\> Get-AzStorageAccountNameAvailability -Name testaccount1
                
                NameAvailable        Reason Message
                -------------        ------ -------
                        False AlreadyExists The storage account named testaccount1 is already taken.
                

                【讨论】:

                  猜你喜欢
                  • 2017-08-20
                  • 1970-01-01
                  • 2011-02-08
                  • 2022-07-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-05
                  相关资源
                  最近更新 更多