Визуализируем Azure Networking при помощи D3js

2024-04-29

Изображение стоит тысячи слов. Когда вы работаете со сложной сетевой инфраструктурой, было бы замечательно иметь вид сверху. В этой статье я хочу обсудить, как это можно достичь с помощью PowerShell, Jupyter notebooks и d3js

Мы уже знакомы с ядром .NET Interactive и Jupyter notebooks. Теперь мы хотим представить новый инструмент - d3js. Вкратце, это мощная визуализационная платформа для JavaScript. Среди прочего, она может помочь визуализировать графические и сетевые структуры. По сути, нам нужно построить собственный граф зависимостей между различными элементами сети, а затем преобразовать эти данные таким образом, чтобы их могла использовать d3js.

Первое, что мы сделаем, - это использование предварительной версии модуля PSQuickGraph, который позволяет динамически генерировать графические структуры.

Install-Module -Name PSQuickGraph -AllowPrerelease -RequiredVersion "2.0.2-alpha"
Import-Module PSQuickGraph -RequiredVersion "2.0.2"

Теперь мы можем инициализировать граф и собрать наши сетевые элементы из Azure.

$g = New-Graph

# pull necessary data
$vnets = Get-AzVirtualNetwork
$nics = Get-AzNetworkInterface

Далее нам нужно обработать наши данные и построить из них граф. Мы фактически сканируем наши массивы $vnets и $nics, добавляем их элементы в виде вершин и соединяем их направленными ребрами, когда они связаны: VNETs включают Subnets, а NICs прикреплены к Subnets.

# add vnets and peerings to the graph
$vnets | ForEach-Object {
    $currentVnet = $_
    $vnetVertex = [PSGraph.Model.PSVertex]::new($currentVnet.Id, $currentVnet)
    Add-Vertex -Graph $g -Vertex $vnetVertex
    $currentVnet.Subnets | % {
        $currentSubnet = $_
        $subnetVertex = [PSGraph.Model.PSVertex]::new($currentSubnet.Id, $currentSubnet)
        Add-Edge -Graph $g -From $vnetVertex -To $subnetVertex
    }
}

foreach ($v in $g.Vertices){
    foreach($p in $v.OriginalObject.VirtualNetworkPeerings) {
        foreach ($rvn in $p.RemoteVirtualNetwork) {
            $targetVertex = $g.Vertices.Where({$_.Label -eq $rvn.id})[0]
            Add-Edge -From $v -To $targetVertex -Graph $g
        }
    }
}

# add NICs to the graph
$nics | ForEach-Object {
    $vnetID = $_.IpConfigurations[0].Subnet.Id
    $targetVertex = $g.Vertices.Where({$_.Label -eq $vnetID})[0]
    Add-Edge -Graph $g -From ([PSGraph.Model.PSVertex]::new($_.name, $_)) -To $targetVertex
}

На этом этапе мы хотим использовать немного магии JS и D3, чтобы визуализировать граф. Часть JS добавляет несколько приятных функций пользовательского интерфейса, таких как список элементов, чтобы мы могли искать определенный узел в графе или выделять узел и другие прямо связанные узлы при клике.

This is how it looks like:

    Вы можете увидеть все это в готовом к использованию jupyter notebook.

    The YouTube player can not be loaded with disabled JavaScript.
    The following video is embedded here:
    https://youtube.com/watch?v=qnWar8mPbfg