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

5
我正在编写一个PowerShell脚本,以自动设置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的返回值”是什么意思?发生了什么事情,你想要什么结果? - Raf
如果 Get-AzureStorageAccount 没有返回我提供的存储账户名称,则创建该存储账户,否则跳过此步骤。 - Julen
9个回答

16

建议使用 Test-AzureName 命令来确定其是否存在。因此,可以这样做。

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

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


5
Get-AzureRmStorageAccountNameAvailability -Name "accountname"

3

试试这个:

$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      
}

1

Test-AzureName在我们的构建代理上无法工作,而且我们已经在代码中添加了try/catch,因此再添加一个将需要将其构建为函数。我选择了标准的获取并检查是否为空,使用-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   
}

1

@Rick Rainey的解决方案适用于使用Add-AzureAccount登录的用户。然而,Azure和powershell有一组冲突和混乱的登录账户(Windows Live与AD)和登录机制(经典: Add-AzureAccount;资源管理器:Login-AzureRmAccount)。一些Azure powershell cmdlets需要特定的登录方式;更进一步,一些还需要特定的账户类型!

为了清理这个复杂、未记录和令人困惑的权限问题,我们总是使用AD账户通过Login-AzureRmAccount进行登录。我们还使用Azure资源管理器(ARM)资源和cmdlets,遵循Microsoft推荐和战略方法转向ARM。然而,@Rick的解决方案不适用于ARM登录。 :-( 因此,您需要另一种方法,即@Darren的方法(用于存储)。但对于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
}

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.

1

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

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

0

在使用PowershellOctopus Deploy设置静态网站托管的Azure存储帐户时,我遇到了这个挑战。

以下是我如何解决它的方法

使用Azure Powershell的Az模块,我执行了以下操作:

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

就这样了。

希望这有所帮助。


0
使用错误变量。
Get-AzStorageAccount -ResourceGroupName 'RG-QA-TEST' -Name 'staccountfor12334ff' -ErrorVariable ev1 -ErrorAction SilentlyContinue

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

谢谢您的回答。下次请考虑将您的代码放在代码环境中 :-) - aljoshare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接