Изучение ресурсов Azure с помощью Resource Graph
Azure Resource Graph помогает быстро и быстро изучить ресурсы Azure и быстро и масштабировать их. Это средство, созданное для обеспечения быстрого отклика, отлично подходит для анализа среды и характеристик ваших ресурсов Azure.
Примечание.
В зависимости от таблицы Resource Graph свойства будут соответствовать регистру, как показано в портал Azure или в нижнем регистре.
Например, имя группы ресурсов при запросе resourceContainers
таблицы будет соответствовать порталу, но resourceGroup
свойство ресурсов из resources
таблицы будет строчным регистром. Это может привести к непредвиденным результатам и может быть учтено в запросах с помощью операторов сравнения без учета регистра, таких как =~
вместо ==
и преобразование свойств в нижний регистр в соединениях с 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
возвращается PSResourceGraphResponse
по умолчанию. Чтобы выходные данные выглядели так же, как и возвращаемые Azure CLI, ConvertTo-Json
командлет используется в свойстве Data
. Значение Depth
по умолчанию — 2. При установке значения 100 все возвращенные уровни должны преобразоваться.
Результаты в формате JSON имеют структуру, аналогичную представленной ниже.
[
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/ContosoVM1",
"kind": "",
"location": "westus2",
"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": "eastus"
},
{
"count_": 215,
"location": "southcentralus"
},
{
"count_": 59,
"location": "westus"
}
]
Теперь мы видим, сколько виртуальных машин имеется в каждом регионе Azure.
Виртуальные машины по номеру SKU
Вернитесь к исходным свойствам виртуальной машины, давайте попытаемся найти все виртуальные машины с размером SKU Standard_B2s
. Возвращенный КОД JSON показывает, что значение хранится в properties.hardwareprofile.vmsize
. Мы обновим запрос, чтобы найти все виртуальные машины, соответствующие этому размеру, и возвращаем только имя виртуальной машины и региона.
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
виртуальным машинам, мы разверните запрос, чтобы вернуть идентификатор ресурса этих управляемых дисков.
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
Результатом будет список идентификаторов дисков.
Обнаружение управляемых дисков
В первой записи из предыдущего запроса вы изучите свойства, которые существуют на управляемом диске, подключенном к первой виртуальной машине. Обновленный запрос использует идентификатор диска и изменяет тип.
Пример выходных данных предыдущего запроса:
[
{
"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
? При просмотре полного идентификатора вы заметите /providers/Microsoft.Compute/disks/
как часть строки. Он подсказывает нам, какой тип нужно искать. В качестве альтернативы можно было бы снять ограничение по типу и выполнить поиск только по полю идентификатора. Так как идентификатор является уникальным, возвращается только одна запись, а type
свойство в нем содержит эти сведения.
Примечание.
Чтобы этот пример можно было выполнить, необходимо заменить значение в поле идентификатора результатом из своей среды.
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": "westus2",
"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-адресов виртуальных машин
Этот набор запросов сначала находит и сохраняет все ресурсы сетевых интерфейсов, подключенные к виртуальным машинам. Затем, чтобы найти каждый ресурс общедоступного IP-адреса и сохранить эти значения, в запросах используется список NIC. Наконец, запросы предоставляют список общедоступных 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), чтобы получить сведения о связанных ресурсах карты сетевого интерфейса с общедоступным 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
Наконец, используйте список ресурсов с общедоступными IP-адресами, хранящийся в файле (Azure CLI) или переменной (Azure PowerShell), чтобы получить фактический общедоступный 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-адреса .
Следующие шаги
- Узнайте больше о языке запросов.
- См. описание используемого языка в статье Примеры запросов к Resource Graph для начинающих.
- Описание расширенных вариантов использования см. в статье Примеры расширенных запросов к Resource Graph.