如何通过 foreach 循环和变量堆栈从 azure 订阅中检索所有数据库

How to retrieve all databases from azure subscription via foreach loop and stack in variable

我有以下方法可以很好地提取所有基于无资源组的数据库的列表并将其存储到名为 $resources

的变量中
$resources = Get-AzureRmResource | ?{ $_.ResourceGroupName -eq "resourceGROUPnameHERE" -and $_.kind -eq "v12.0,user"  } | select resourcename,resourceid

输出如下所示(每个资源名称和资源 ID 在两列中)

ResourceName              ResourceId
------------              ----------
georgidbserver1/georgiDB1 /subscriptions/aaaaaa-bbbb-486a-96cf-6c68361d8000/resourceGroups/georgigroup/providers/Microsoft.Sql/servers/georgidbserver1/databases/georgiDB1
georgidbserver1/georgiDB2 /subscriptions/aaaaaa-bbbb-486a-96cf-6c68361d8000/resourceGroups/georgigroup/providers/Microsoft.Sql/servers/georgidbserver1/databases/georgiDB2

我想要实现的是获得相同的输出并将其以相同的方式存储到一个变量中,但不是针对单个资源组,而是我希望它从我的订阅中检查所有资源组并提取所有他们的数据库在列表中。

我创建了以下代码,在 powershell 中输出了我所需要的内容 window

代码是

$rg = Get-AzureRmResourceGroup | ?{ $_.ProvisioningState -eq "succeeded" } | select -expandproperty resourcegroupname
foreach ($resourcegroup in $rg) {Get-AzureRmResource | ?{ $_.ResourceGroupName -eq $resourcegroup -and $_.kind -eq "v12.0,user"  } | select resourcename,resourceid}

输出看起来像这样(正是我想要的)

PS C:\Users> .\small.ps1

ResourceName              ResourceId
------------              ----------
georgidbserver2/georgiDB3 /subscriptions/17e1cc9e-4eb3-486a-96cf-6c68361d8000/resourceGroups/dbgroup/providers/Microsoft.Sql/servers/georgidbserver2/databases/georgiDB3
georgidbserver2/georgiDB4 /subscriptions/17e1cc9e-4eb3-486a-96cf-6c68361d8000/resourceGroups/dbgroup/providers/Microsoft.Sql/servers/georgidbserver2/databases/georgiDB4
georgidbserver1/georgiDB1 /subscriptions/17e1cc9e-4eb3-486a-96cf-6c68361d8000/resourceGroups/georgigroup/providers/Microsoft.Sql/servers/georgidbserver1/databases/georgiDB1
georgidbserver1/georgiDB2 /subscriptions/17e1cc9e-4eb3-486a-96cf-6c68361d8000/resourceGroups/georgigroup/providers/Microsoft.Sql/servers/georgidbserver1/databases/georgiDB2

我的问题是如何将产生 4 行的第二个代码的输出存储到一个变量中,就像它在 $resources 的第一个示例中一样。

我希望以后能够遍历它并为 subscription.I 中的所有数据库创建数据库警报已经有了为每个资源的所有数据库创建警报的代码 group.Here 我正在寻找实现相同但对于订阅中的所有数据库

下面是我用来为每个资源组创建数据库警报的完整代码,供参考

<#create CPU,DTU and Storage alerts for as many databases as you have in the resource group provided by keyboard input#>

#define variable for resource group name by requesting keyboard input

$rg = Read-Host 'Please, input resource group name here (exactly as it is in Azure)'

<#create the array containing databases where alerts are required. The value of v12.0,user corresponds to the kind of resource as to include only the SQL DBs and not the SQL servers#>

$resources = Get-AzureRmResource | ?{ $_.ResourceGroupName -eq $rg -and $_.kind -eq "v12.0,user"  } | select resourcename,resourceid

#loop through the array and create the DTU alert rule for each DB

foreach($resource in $resources){$alertname=$resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-DTU-Alert";Add-AzureRMMetricAlertRule -ResourceGroup $rg -location "centralus" -targetresourceid $resource.resourceid -Name $alertname -MetricName "dtu_consumption_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "Client-email@here")}

#loop through the array and create the CPU alert rule for each DB

foreach($resource in $resources){$alertname=$resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-CPU-Alert";Add-AzureRMMetricAlertRule -ResourceGroup $rg -location "centralus" -targetresourceid $resource.resourceid -Name $alertname -MetricName "cpu_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "Client-email@here")}

#loop through the array and create the STORAGE alert rule for each DB

foreach($resource in $resources){$alertname=$resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-STORAGE-Alert";Add-AzureRMMetricAlertRule -ResourceGroup $rg -location "centralus" -targetresourceid $resource.resourceid -Name $alertname -MetricName "storage_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "Client-email@here")}

您可以使用嵌套循环。以下脚本适合我。

$rg = Get-AzureRmResourceGroup | ?{ $_.ProvisioningState -eq "succeeded" } | select -expandproperty resourcegroupname
foreach ($resourcegroup in $rg) 
{
    $resources = Get-AzureRmResource | ?{ $_.ResourceGroupName -eq $resourcegroup -and $_.kind -eq "v12.0,user"  } | select resourcename,resourceid,location
    foreach ($resource in $resources)
    {
        ##create the DTU alert rule for each DB
        $alertname = $resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-DTU-Alert"
        Add-AzureRMMetricAlertRule -ResourceGroupName $resourcegroup  -Location $resource.location -targetresourceid $resource.resourceid -Name $alertname -MetricName "dtu_consumption_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "test@hotmail.com")

        ##create the CPU alert rule for each DB
        $alertname=$resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-CPU-Alert"
        Add-AzureRMMetricAlertRule -ResourceGroupName $resourcegroup  -Location $resource.location -targetresourceid $resource.resourceid -Name $alertname -MetricName "cpu_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "test@hotmail.com")

        ##create the STORAGE alert rule for each DB
        $alertname=$resource.resourcename.Substring($resource.resourcename.IndexOf('/')+1)+"-STORAGE-Alert"
        Add-AzureRMMetricAlertRule -ResourceGroupName $resourcegroup  -Location $resource.location -targetresourceid $resource.resourceid -Name $alertname -MetricName "storage_percent" -Operator "GreaterThan" -Threshold 90 -WindowSize $([TimeSpan]::Parse("00:15:00")) -TimeAggregationOperator "Average" -verbose -Actions $(New-AzureRmAlertRuleEmail -SendToServiceOwners -CustomEmails "test@hotmail.com")
    }
}