Azure Powershell - 检查资源是不是存在
Posted
技术标签:
【中文标题】Azure Powershell - 检查资源是不是存在【英文标题】:Azure Powershell - Check to see if resource existsAzure Powershell - 检查资源是否存在 【发布时间】:2015-05-06 12:21:22 【问题描述】:我正在使用 Powershell 自动设置我的 Azure 环境 - 创建存储帐户、数据库、网站等。
在开发中,我想提供和拆除很多东西。很多时候,我想运行我的配置脚本并创建一个 azure 资产如果它尚不存在
但是,我还没有找到一种优雅的方式来做到这一点。如果项目不存在,一些“Get”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.
有没有更好的方法来做到这一点?
【问题讨论】:
catch 只会捕获终止错误,您是否在 try/catch 之前将$errorActionPreference
设置为 "stop"
?
谢谢 - 这解决了第二个问题。现在我只希望我不必捕获错误就可以做到这一点。
Get-AzureStorageAccount cmdlet 返回一个对象,其中包含有关当前订阅的存储帐户的详细信息。如果指定了 StorageAccountName 参数,则仅返回该存储帐户。所以不要使用这个参数,并在结果中检查存储名称是否存在。
【参考方案1】:
您应该为此使用 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 应用程序(以前称为 Azure 网站)也是如此,您可以在其中拥有一个 DNS 名称,例如 contoso.azurewebsites.net
。因此,换句话说,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.
【讨论】:
是否有等效的资源管理器? 是否有任何 RM 命令可用于检查全局部署的资源? Test-AzureRmDnsAvailability 接受 Location 作为参数。但是对于全局部署的 TrafficManager 资源,这个命令永远不会奏效...... Test-AzureName 无法按预期工作。它要求 select-AzureSubscription 和 select-AzureSubscription 说我的工作订阅名称和 ID 不存在。最后最终使用 Test-AzureRmDnsAvailability 创建 HDInsight。知道如何在全局范围内检查名称是否存在? 对于大多数提供商,有一个名为 checkNameAvailability 的 API,您可以使用它来查看名称是否已被使用或全球唯一。我已经在 PowerShell 函数中封装了其中的一些。见secureinfra.blog/2019/11/07/…【参考方案2】:试试这个:
if(!(Get-AzureRmStorageAccountNameAvailability -Name $storageName))
New-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -Name $storageName -SkuName Standard_LRS
【讨论】:
如果存储名称可用,则如果 Get-AzureRmStorageAccountNameAvailability 返回“true”,则 if-check 被“反转”。除此之外,如果您处于 ARM 模式,则检查是完美的。【参考方案3】:这是我使用新 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"
【讨论】:
如果出现 ResourceNotFound 以外的错误怎么办?【参考方案4】:我通常会选择以下内容(适用于 Azure 中的几乎所有资源,只需替换“获取”模块和参数):
function Test-AzureStorageAccountExists
Param(
[string]$resourceGroupName,
[string]$storageAccountName
)
$SA = Get-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -ErrorVariable notPresent -ErrorAction SilentlyContinue
if ($notPresent) return $false
【讨论】:
【参考方案5】:像这样?
if(
Get-AzureStorageAccount | Where $_.Label -match $name | measure |select -expand count -eq 0)
$storageAcct = New-AzureStorageAccount -StorageAccountName $Name -Location $Location
【讨论】:
【参考方案6】:也许您可以使用 cmdlet Get-AzureRmResource。如果资源存在,则返回指定资源的信息,包括资源类型;如果不是,则返回 $null。 例如。:
$MyRes=Get-AzureRmResource -ResourceName "MyResourceName" -ResourceGroupName
"MyResourceGroupName"
if ($null == $MyRes)
# Not existing
【讨论】:
@Dan 我已经运行了上述程序(删除了 if),如果资源不存在,它不会失败。它什么也不返回。【参考方案7】:在决定是否需要创建变量之前,我需要使用 Get-AzureRmAutomaitonVariable 检查 Azure 自动化帐户中是否存在变量。 user888734 使用“catch”的解决方案帮助我解决了这个我被阻止了 2 天的问题:-)
try
$existingVariable = Get-AzureRMAutomationVariable -ResourceGroupName $resourceGroup -AutomationAccountName $automationAccountName -Name $variable
catch
New-AzureRmAutomationVariable -ResourceGroupName $resourceGroup -AutomationAccountName $automationAccountName -Name $variable -Value $value -Encrypted $False
【讨论】:
以上是关于Azure Powershell - 检查资源是不是存在的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 powershell “解析” Azure 资源 ID 对象
Azure按订阅,资源组,资源类型导出所有资源powershell命令