Esplorare le risorse di Azure con Resource Graph

Resource Graph di Azure offre la possibilità di esplorare e individuare rapidamente e su larga scala le risorse di Azure. Progettato per risposte rapide, è un ottimo modo per acquisire informazioni sull'ambiente e anche sulle proprietà esistenti nelle risorse di Azure.

Esplorazione delle macchine virtuali

Una risorsa comune in Azure è una macchina virtuale. Come tipo di risorsa, le macchine virtuali hanno molte proprietà su cui è possibile eseguire query. Ogni proprietà fornisce un'opzione per filtrare o individuare esattamente la risorsa che si sta cercando.

Dettagli delle macchine virtuali

Si inizierà con una query semplice per ottenere una singola macchina virtuale dall'ambiente e esaminare le proprietà restituite.

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

Nota

Il cmdlet Azure PowerShell Search-AzGraphrestituisce un PSResourceGraphResponse per impostazione predefinita. Per fare in modo che l'output corrisponda a quello restituito dall'interfaccia della riga di comando di Azure, il ConvertTo-Json cmdlet viene usato nella proprietà Data . Il valore predefinito per Profondità è 2. Impostandolo su 100 deve convertire tutti i livelli restituiti.

I risultati JSON sono strutturati in modo simile all'esempio seguente:

[
  {
    "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/contosovm1535",
            "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_9676b7e1b3c44e2cb672338ebe6f5166",
            "resourceGroup": "MyResourceGroup",
            "storageAccountType": "Premium_LRS"
          },
          "name": "ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
          "osType": "Windows"
        }
      },
      "vmId": "bbb9b451-6dc7-4117-bec5-c971eb1118c6"
    },
    "resourceGroup": "MyResourceGroup",
    "sku": {},
    "subscriptionId": "<subscriptionId>",
    "tags": {},
    "type": "microsoft.compute/virtualmachines"
  }
]

Le proprietà indicano informazioni aggiuntive sulla risorsa macchina virtuale stessa. Queste proprietà includono: sistema operativo, dischi, tag e il gruppo di risorse e la sottoscrizione di cui è membro.

Macchine virtuali per posizione

Con le informazioni acquisite sulle risorse delle macchine virtuali, è possibile usare la proprietà posizione per il conteggio di tutte le macchine virtuali per posizione. Per aggiornare la query, verrà rimosso il limite e verrà riepilogato il conteggio dei valori di posizione.

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

I risultati JSON sono strutturati in modo simile all'esempio seguente:

[
  {
    "count_": 386,
    "location": "eastus"
  },
  {
    "count_": 215,
    "location": "southcentralus"
  },
  {
    "count_": 59,
    "location": "westus"
  }
]

È possibile visualizzare il numero di macchine virtuali disponibili in ogni area di Azure.

Macchine virtuali per SKU

Tornando alle proprietà originali delle macchine virtuali, è possibile tentare di trovare tutte le macchine virtuali che hanno una dimensione SKU di Standard_B2s. Esaminando il codice JSON restituito, si noterà che è archiviato in properties.hardwareprofile.vmsize. Verrà aggiornata la query per trovare tutte le macchine virtuali che corrispondono a queste dimensioni e verrà restituito solo il nome della macchina virtuale e l'area.

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

Macchine virtuali connesse a Dischi gestiti Premium

Per ottenere i dettagli dei dischi gestiti Premium collegati a queste macchine virtuali Standard_B2s , espandere la query per restituire l'ID risorsa di tali dischi gestiti.

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

Il risultato è un elenco di ID di dischi.

Individuazione di un disco gestito

Con il primo record dalla query precedente, verranno esaminate le proprietà che esistono sul disco gestito che è stato collegato alla prima macchina virtuale. La query aggiornata usa l'ID del disco e cambia il tipo.

Output di esempio dalla query precedente, ad esempio:

[
  {
    "disk_id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166"
  }
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'

Prima di eseguire la query, come facciamo a sapere di che tipo dovrebbe ora essere Microsoft.Compute/disks? Se si esamina l'ID completo, si noterà /providers/Microsoft.Compute/disks/ come parte della stringa. Questo frammento di stringa fornisce un hint per il tipo da cercare. Un metodo alternativo potrebbe essere quello di rimuovere il limite per tipo ed effettuare invece la ricerca solo per il campo ID. Poiché l'ID è univoco, verrebbe restituito un solo record e la proprietà tipo fornisce i dettagli.

Nota

Affinché questo esempio funzioni, è necessario sostituire il campo ID con un risultato dal proprio ambiente.

az graph query -q "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'").Data | ConvertTo-Json

I risultati JSON sono strutturati in modo simile all'esempio seguente:

[
  {
    "id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
    "kind": "",
    "location": "westus2",
    "managedBy": "",
    "name": "ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
    "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"
  }
]

Esplorare le macchine virtuali per trovare gli indirizzi IP pubblici

Questo set di query prima di tutto trova e archivia tutte le risorse delle interfacce di rete (NIC) connesse alle macchine virtuali. Quindi le query usano l'elenco delle interfacce di rete per trovare ogni risorsa di indirizzo IP che è un indirizzo IP pubblico e archiviano tali valori. Infine, le query forniscono un elenco degli indirizzi IP pubblici.

# 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

Usare il file (interfaccia della riga di comando di Azure) o la variabile (Microsoft Azure PowerShell) nella query successiva per ottenere i dettagli delle risorse di interfaccia di rete correlate in cui è presente un indirizzo IP pubblico collegato alla scheda di interfaccia di rete.

# 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

Infine usare l'elenco delle risorse di indirizzi IP pubblici archiviato nel file (interfaccia della riga di comando di Azure) o la variabile (Microsoft Azure PowerShell) per ottenere l'indirizzo IP pubblico effettivo e visualizzarlo.

# 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

Per informazioni su come eseguire questi passaggi in una singola query con l'operatore join, vedere l'esempio elenco di macchine virtuali con l'interfaccia di rete e l'indirizzo IP pubblico.

Passaggi successivi