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:检查VM代理运行状况

如何使用 powershell “解析” Azure 资源 ID 对象

Azure按订阅,资源组,资源类型导出所有资源powershell命令

Azure 资源锁 - 被 Powershell Remove-AzureVM 绕过

Azure Powershell对ASM资源的基本操作

如何通过 PowerShell 或 ARM 模板在 Azure 数据资源管理器中创建表和摄取映射