我正在构建一个电源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
的返回。
非常感谢你!
答案 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 " "
- 因为我们连接字符串和变量,所以使用双引号来允许字符串插值。
仅此而已。
我希望这会有所帮助