使用 Resource Graph 浏览 Azure 资源
Azure Resource Graph 可帮助你快速、大规模浏览和发现 Azure 资源的功能。 它专为快速响应而设计,是了解你的环境以及 Azure 资源中的属性的好方法。
注意
根据 Resource Graph 表,属性将与 Azure 门户中显示的大小写匹配或小写。
例如,查询 resourceContainers
表时资源组的名称将与门户匹配,但 resources
表中资源的 resourceGroup
属性将为小写。 这可能会导致意外结果,可以通过在查询中使用不区分大小写的比较运算符(例如 =~
而不是 ==
)以及在与函数 tolower()
联接时将属性转换为小写来解决。
浏览虚拟机
Azure 中的一种常见资源是虚拟机。 作为资源类型,虚拟机具有许多可以查询的属性。 每个属性都提供了一个筛选或查找你正在寻找的资源的选项。
虚拟机发现
让我们从一个简单的查询开始,从环境中获取一个虚拟机并查看返回的属性。
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| limit 1
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | limit 1"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | limit 1").Data | ConvertTo-Json -Depth 100
注意
Azure PowerShell Search-AzGraph
cmdlet 默认情况下会返回 PSResourceGraphResponse
。 若要让输出与 Azure CLI 返回的内容相同,请在 Data
属性上使用 ConvertTo-Json
cmdlet。 Depth
的默认值为 2。 将它设置为“100” 应转换所有返回的级别。
JSON 结果的结构类似于下面的示例:
[
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/ContosoVM1",
"kind": "",
"location": "chinanorth2",
"managedBy": "",
"name": "ContosoVM1",
"plan": {},
"properties": {
"hardwareProfile": {
"vmSize": "Standard_B2s"
},
"networkProfile": {
"networkInterfaces": [
{
"id": "/subscriptions/<subscriptionId>/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/contosovm2222",
"resourceGroup": "MyResourceGroup"
}
]
},
"osProfile": {
"adminUsername": "localAdmin",
"computerName": "ContosoVM1",
"secrets": [],
"windowsConfiguration": {
"enableAutomaticUpdates": true,
"provisionVMAgent": true
}
},
"provisioningState": "Succeeded",
"storageProfile": {
"dataDisks": [],
"imageReference": {
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2016-Datacenter",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": 127,
"managedDisk": {
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"resourceGroup": "MyResourceGroup",
"storageAccountType": "Premium_LRS"
},
"name": "ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"osType": "Windows"
}
},
"vmId": "11111111-1111-1111-1111-111111111111"
},
"resourceGroup": "MyResourceGroup",
"sku": {},
"subscriptionId": "<subscriptionId>",
"tags": {},
"type": "microsoft.compute/virtualmachines"
}
]
这些属性可告知有关虚拟机资源本身的其他信息。 这些属性包括:操作系统、磁盘、标签、资源组及其所属订阅。
按位置列出的虚拟机
根据我们对虚拟机资源的了解,我们使用 location
属性按位置计算所有虚拟机。 要更新查询,我们将删除限制并汇总位置值的计数。
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| summarize count() by location
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by location"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by location").Data | ConvertTo-Json
JSON 结果的结构类似于下面的示例:
[
{
"count_": 386,
"location": "chinaeast"
},
{
"count_": 215,
"location": "chinaeast2"
},
{
"count_": 59,
"location": "chinanorth"
}
]
现在可以看到每个 Azure 区域中有多少个虚拟机。
按 SKU 列出的虚拟机
回到原始虚拟机属性,尝试查找 SKU 大小为 Standard_B2s
的所有虚拟机。 返回的 JSON 显示该值存储在 properties.hardwareprofile.vmsize
中。 我们将更新查询以查找与此大小匹配的所有虚拟机 (VM),并仅返回 VM 和区域的名称。
Resources
| where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s'
| project name, resourceGroup
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | project name, resourceGroup"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | project name, resourceGroup").Data | ConvertTo-Json
连接到高级托管磁盘的虚拟机
如果要获取附加到这些 Standard_B2s
虚拟机的高级托管磁盘的详细信息,可以扩展查询以返回这些托管磁盘的资源 ID。
Resources
| where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s'
| extend disk = properties.storageProfile.osDisk.managedDisk
| where disk.storageAccountType == 'Premium_LRS'
| project disk.id
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | extend disk = properties.storageProfile.osDisk.managedDisk | where disk.storageAccountType == 'Premium_LRS' | project disk.id"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | extend disk = properties.storageProfile.osDisk.managedDisk | where disk.storageAccountType == 'Premium_LRS' | project disk.id").Data | ConvertTo-Json
结果是磁盘 ID 列表。
托管磁盘发现
使用从上一个查询获取的第一条记录,你将浏览已附加到第一个虚拟机的托管磁盘上存在的属性。 更新的查询使用磁盘 ID 并更改类型。
上一个查询的示例输出如下:
[
{
"disk_id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111"
}
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'
在运行查询之前,如何知道 type
现在是 Microsoft.Compute/disks
? 如果查看完整 ID,你会注意到作为字符串一部分的 /providers/Microsoft.Compute/disks/
。 此字符串片段为你提供了要搜索的类型的提示。 另一种方法是按类型删除限制,而只搜索 ID 字段。 由于 ID 是唯一的,因此只返回一条记录,并且 ID 的 type
属性提供该详细信息。
注意
要使此示例起作用,必须使用自己的环境中的结果替换 ID 字段。
az graph query -q "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'").Data | ConvertTo-Json
JSON 结果的结构类似于下面的示例:
[
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"kind": "",
"location": "chinanorth2",
"managedBy": "",
"name": "ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"plan": {},
"properties": {
"creationData": {
"createOption": "Empty"
},
"diskSizeGB": 127,
"diskState": "ActiveSAS",
"provisioningState": "Succeeded",
"timeCreated": "2018-09-14T12:17:32.2570000Z"
},
"resourceGroup": "MyResourceGroup",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
},
"subscriptionId": "<subscriptionId>",
"tags": {
"environment": "prod"
},
"type": "microsoft.compute/disks"
}
]
浏览虚拟机以查找公共 IP 地址
这一组查询首先查找并存储已连接到虚拟机的所有网络接口卡 (NIC) 资源。 然后,查询使用 NIC 列表查找是公共 IP 地址的每个 IP 地址资源并存储这些值。 最后,查询提供公共 IP 地址的列表。
# Use Resource Graph to get all NICs and store in the 'nics.txt' file
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project nic = tostring(properties['networkProfile']['networkInterfaces'][0]['id']) | where isnotempty(nic) | distinct nic | limit 20" --output table | tail -n +3 > nics.txt
# Review the output of the query stored in 'nics.txt'
cat nics.txt
# Use Resource Graph to get all NICs and store in the $nics variable
$nics = (Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project nic = tostring(properties['networkProfile']['networkInterfaces'][0]['id']) | where isnotempty(nic) | distinct nic | limit 20").Data
# Review the output of the query stored in the variable
$nics.nic
在下一个查询中,使用文件 (Azure CLI) 或变量 (Azure PowerShell) 获取 NIC 附加了公共 IP 地址的相关网络接口卡资源详细信息。
# Use Resource Graph with the 'nics.txt' file to get all related public IP addresses and store in 'publicIp.txt' file
az graph query -q="Resources | where type =~ 'Microsoft.Network/networkInterfaces' | where id in ('$(awk -vORS="','" '{print $0}' nics.txt | sed 's/,$//')') | project publicIp = tostring(properties['ipConfigurations'][0]['properties']['publicIPAddress']['id']) | where isnotempty(publicIp) | distinct publicIp" --output table | tail -n +3 > ips.txt
# Review the output of the query stored in 'ips.txt'
cat ips.txt
# Use Resource Graph with the $nics variable to get all related public IP addresses and store in $ips variable
$ips = (Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Network/networkInterfaces' | where id in ('$($nics.nic -join "','")') | project publicIp = tostring(properties['ipConfigurations'][0]['properties']['publicIPAddress']['id']) | where isnotempty(publicIp) | distinct publicIp").Data
# Review the output of the query stored in the variable
$ips.publicIp
最后,使用存储在文件 (Azure CLI) 或变量 (Azure PowerShell) 中的公共 IP 地址资源列表从相关对象获取实际公共 IP 地址并显示。
# Use Resource Graph with the 'ips.txt' file to get the IP address of the public IP address resources
az graph query -q="Resources | where type =~ 'Microsoft.Network/publicIPAddresses' | where id in ('$(awk -vORS="','" '{print $0}' ips.txt | sed 's/,$//')') | project ip = tostring(properties['ipAddress']) | where isnotempty(ip) | distinct ip" --output table
# Use Resource Graph with the $ips variable to get the IP address of the public IP address resources
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Network/publicIPAddresses' | where id in ('$($ips.publicIp -join "','")') | project ip = tostring(properties['ipAddress']) | where isnotempty(ip) | distinct ip").Data | ConvertTo-Json
若要了解如何使用 join
运算符在单个查询中完成这些步骤,请转到列出虚拟机及其网络接口和公共 IP 示例。