
Можете представить, сколько времени уйдёт на генерацию списка VM среди сотен подписок Azure? Целая вечность. Известно, что портал Azure выводит только первые 1000 подписок, что усложняет запрос ресурсов с его помощью, когда подписок у вас намного больше. К счастью, есть способ делать это гораздо быстрее и динамичнее. В этой статье мы разберём функционал Azure Resource Graph и используем эту службу с помощью PowerShell, существенно повысив гибкость управления запросами.
Содержание статьи:
— Resource Graph и Kusto Query Language
— Модуль Resource Graph для PowerShell
— Ограничения
— Полезные виды запросов
— Форматирование результатов
— Заключение
Resource Graph и Kusto Query Language
Azure Resource Graph — это сервис, который позволяет более точно запрашивать ресурсы среди множества подписок, используя таблицы Resource Graph.
Kusto Query Language (KQL) — это язык запросов, с помощью которого Resource Graph возвращает запрашиваемые данные. KQL поддерживает много операторов, включая
join и union, которые позволяют устанавливать межтабличные связи для возвращения более подробных результатов сразу по нескольким таблицам.Прим. переводчика:
Чуть подробнее о Kusto. Это специальный процесс, язык, который позволяет получить ридонли результаты из ваших источников данных. Вся система очень похожа на SQL.
Сам запрос состоит из последовательности инструкций, разделяемых точкой с запятой. Точно как мы с вами привыкли видеть в практически любой оболочке БД. Последняя инструкция должна возвращать то, что мы называем Tabular Expression Statement. Первая инструкция обычно получает данные из какого-либо источника, последующие операторы преобразуют данные, а последний оператор рендерит эти данные.
Данные передаются от инструкции к инструкции через конвейер |. Обычный запрос в Kusto выглядит примерно так (пример из docs.microsoft.com):
StormEvents | where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01) | where State == "FLORIDA" | count
Любому хабрачеловеку тут всё будет понятно.
Запросы Resource Graph можно выполнять на портале Azure. Но мы-то с вами продвинутые пользователи, поэтому использовать будем PowerShell. Да, конечно, у нас есть Resource Graph Explorer, предлагающий UI, где можно найти доступные для использования в запросах таблицы Resource Graph. Запросы также можно сохранять для последующего использования. Но после написания пары десятков этих запросов вы уже будете знать все таблицы наизусть и сможете строчить их напрямую.

Запросы в Azure Portal можно делать с помощью проводника Resource Graph
В примере выше перечислены все ресурсы с их базовыми подробностями, такими как
ID, name, subscriptionID, resourceGroup и далее.Модуль Resource Graph для PowerShell
Модуль
Az.ResourceGraph можно использовать в PowerShell для запроса ресурсов Azure по всему клиенту или среди набора подписок. Так выглядит простой запрос, который можно выполнить через PowerShell:$KustoQuery = " resources | where name starts with 'Network' " $result = Search-AzGraph -Query $KustoQuery $result | select name
Простой запрос Kusto для вывода списка всех ресурсов:
PS C: $KustoQuery = " >> resources >> | where name starts with 'Network' >> " $result = Search-AzGraph -Query $KustoQuery $result | select name name - - - - NetworkWatcher_cenralus NetworkWatcher_norteurope NetworkWatcher_westeurope NetworkWatcher_westus NetworkWatcher_eastus NetworkWatcher_japanwest NetworkWatcher_norteurope NetworkWatcher_uksouth NetworkWatcher_westeurope NetworkWatcher_eastus NetworkWatcher_norteurope PS C:\>
Этот запрос выведет список всех ресурсов с именами, начинающимися с
Network.Прим. переводчика:
Для удобной работы с PowerShell очень рекомендуется установить
oh-my-posh и использовать Windows Terminal. oh-my-posh добавляет большое количество функций к Powershell, которых так не хватает пользователям командной строки в Linux. В частности, reverse-i-search.Ограничения
Имейте в виду, что PowerShell может запрашивать через Resource Graph только первые 1000 подписок. Если же у вас их больше, то потребуется разбить их на отдельные пакеты.
С одной стороны, это очень странное ограничение. Любой, кто работал с базами данных, тут может удивиться. Но если подумать, то оно кажется достаточно разумным. Мы же не с базой данных работаем, а запрашиваем объекты из AD. Если их наплодится больше 1000, то возможно, вам стоит подумать о том, как их структурировать в более приличном виде.
Ещё одним ограничением является вывод в ответ на запрос максимум 1000 результатов. Чтобы его обойти, можно проигнорировать определённое их число с помощью параметра
Skip. В примере ниже первая команда выдаёт первые пять результатов, а вторая игнорирует эти первые результаты и выводит остальные. Так что можно просто динамически устанавливать параметры first и Skip, чтобы возвращать все результаты, не ограничиваясь 1000.Всем, кто сталкивается с подобными ограничениями, рекомендуется обратиться к этому документу. Там вам более подробно изложат варианты работы.
$result = Search-AzGraph -Query $KustoQuery -first 5 $result | select name $result = Search-AzGraph -Query $KustoQuery -Skip 5 $result | select name

Параметры
first и Skip помогают, когда нужно вывести более 1000 ресурсовПолезные виды запросов
Вот несколько примеров запросов, которые можно совершать с помощью Resource Graph.
Вывод ресурсов по типу
Запрос для вывода определённого типа ресурсов:
$KustoQuery = " Resources | where type == 'microsoft.storage/storageaccounts' " $result = Search-AzGraph -Query $KustoQuery $result | select name

Вывод ресурсов учётной записи хранения
Вывод виртуальных машин Windows
Запрос для вывода только VM с Windows:
$KustoQuery = " Resources | where type == 'microsoft.compute/virtualmachines' | where properties.storageProfile.osDisk.osType == 'Windows' " $result = Search-AzGraph -Query $KustoQuery $result | select name, @{l="OsType";e={$_.properties.storageProfile.osDisk.osType}}

Вывод VM с Windows
Вывод всех публичных IP
В сценарии ниже мы выводим все публичные адреса IP вместе с идентификаторами их ресурсов, но в качестве имени для идентификаторов будет отображаться
SampleColumnToRepresentResourceId.
Вывод публичных адресов IP с кастомным именем для
ResourceIdВывод групп ресурсов с конкретным тегом
Следующий запрос выведет только группы ресурсов с заданным тегом:
$KustoQuery = " resourcecontainers | where type == 'microsoft.resources/subscriptions/resourcegroups' | where tags['Importance'] == 'High' " $result = Search-AzGraph -Query $KustoQuery $result | select name

Вывод групп ресурсов с заданным тегом
Подсчёт ресурсов в определённом регионе
Следующий запрос позволит получить количество ресурсов в
North Europe, сгруппированных по их subscriptionId:$KustoQuery = " resources | where location == 'northeurope' | summarize total=count () by subscriptionId " $result = Search-AzGraph -Query $KustoQuery $result | select total, subscriptionId, @{l="location";e={"North Europe"}}

Подсчёт ресурсов в регионе North Europe
Вывод запущенных VM
Для вывода только запущенных VM используем такой запрос:
$KustoQuery = " resources | where type == 'microsoft.compute/virtualmachines' | where properties.extended.instanceView.powerState.displayStatus == 'VM running' | project name, location, resourceGroup " $result = Search-AzGraph -Query $KustoQuery $result

Запрос для получения запущенных VM
Вывод ресурсов VM, не соответствующих политикам
VM, не соответствующие текущим политикам, выводятся так:
$KustoQuery = " policyresources | where type == 'microsoft.policyinsights/policystates' | where properties.complianceState == 'NonCompliant' | where properties.resourceType =~ 'microsoft.compute/virtualmachines' | project resourceGroup, id=properties.resourceId, ComplianceStatus = properties.complianceState " $result = Search-AzGraph -Query $KustoQuery $result | fl *

Получение списка несоответствующих ресурсов VM
Прим. переводчика:
Форматирование результатов
Конечно, не стоит забывать про то, что PowerShell имеет большое количество различных способов форматирования конечных результатов. В данном случае запросы в Kusto можно форматировать с помощью параметра в вызове метода. Существуют два способа форматирования конечных данных: Таблица и Массив Объектов.
Более того, эти данные отлично обрабатываются встроенной функцией
ConvertTo-Json.Вот пример возвращаемой таблицы данных, созданной с помощью параметра
resultFormat=Table, пропущенных через ConvertTo-JSON:{ "totalRecords": 47, "count": 1, "data": { "columns": [{ "name": "name", "type": "string" }, { "name": "type", "type": "string" }, { "name": "location", "type": "string" }, { "name": "subscriptionId", "type": "string" } ], "rows": [ [ "veryscaryvm2-nsg", "microsoft.network/networksecuritygroups", "eastus", "11111111-1111-1111-1111-111111111111" ] ] }, "facets": [], "resultTruncated": "true" }
Подобные данные очень просто обрабатывать в любых других программах. Подробности о том, как правильно отформатировать ваши данные, описаны здесь.
Заключение
Resource Graph является очень удобным и быстрым решением для выполнения запросов в Azure, который позволяет в развёрнутом виде запрашивать ресурсы среди огромного числа подписок. При этом язык KQL существенно упрощает получение данных с помощью PowerShell и Resource Graph.
Каждый уважающий себя системный администратор всегда держит под рукой репозиторий с набором скриптов, упрощающих жизнь. KQL позволяет быстро писать простейшие утилиты, позволяющие анализировать данные в Azure. Более того, уже готовые данные, собранные в виде JSON, достаточно просто отправлять в различные no-SQL базы данных для их последующего анализа. В этом случае KQL может упростить жизнь любителям ELK, Graylog и тому подобных систем сбора информации.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
- — 15% на все тарифы VDS (кроме тарифа Прогрев) HABRFIRSTVDS.
Доступно до 31 декабря 2021 г.
