如何使用Get-AzureStorageAccount检查Azure中是否存在存储帐户

时间:2014-06-23 11:05:11

标签: powershell azure azure-storage

我正在构建一个电源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的返回。

非常感谢你!

8 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:4)

Get-AzureRmStorageAccountNameAvailability -Name "accountname"

答案 2 :(得分:1)

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   
}

答案 3 :(得分:1)

如果您使用Add-AzureAccount登录,则@Rick Rainey的解决方案有效。但是,Azure和PowerShell具有冲突且令人困惑的登录帐户套件(Windows Live与AD)和登录机制(Classic: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
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

对于 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.

答案 6 :(得分:0)

使用错误变量

Get-AzStorageAccount -ResourceGroupName 'RG-QA-TEST' -Name 'staccountfor12334ff' -ErrorVariable ev1 -ErrorAction SilentlyContinue

if ($ev1) {
    Write-Host "-------------------------- Creating OEM Storage"
    //create storage account
}

答案 7 :(得分:0)

我在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 " " - 因为我们连接字符串和变量,所以使用双引号来允许字符串插值。

仅此而已。

我希望这会有所帮助