Condividi tramite


Esplorare le risorse di Azure con Resource Graph

Azure Resource Graph consente di esplorare le risorse di Azure rapidamente e su larga scala. Progettato per fornire risposte rapide, è un'ottima soluzione per ottenere informazioni sull'ambiente e sulle proprietà esistenti nelle risorse di Azure.

Nota

In base alla tabella di Resource Graph, i nomi delle proprietà avranno la combinazione di maiuscole e minuscole usata nel portale di Azure oppure avranno solo caratteri minuscoli. Ad esempio, il nome di un gruppo di risorse quando si esegue una query relativa alla tabella resourceContainers corrisponderà a quello usato nel portale, ma la proprietà resourceGroup delle risorse della tabella resources sarà in caratteri minuscoli. Questo può causare risultati imprevisti. Il problema può essere prevenuto nelle query usando operatori di confronto che non facciano distinzione tra maiuscole e minuscole, ad esempio =~ anziché ==, e convertendo le proprietà in caratteri minuscoli nei join con la funzione tolower().

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

Iniziare con una semplice query per ottenere una singola macchina virtuale dall'ambiente ed 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 Search-AzGraph di Azure PowerShell restituisce PSResourceGraphResponse per impostazione predefinita. Affinché l'output abbia lo stesso aspetto di quello restituito dall'interfaccia della riga di comando di Azure, viene usato il cmdlet ConvertTo-Json nella proprietà Data. Il valore predefinito per Depth è 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/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"
  }
]

Le proprietà consentono di recuperare informazioni aggiuntive sulla risorsa macchina virtuale stessa. Tali proprietà includono: sistema operativo, dischi, tag, nonché il gruppo di risorse e la sottoscrizione di cui fa parte.

Macchine virtuali per posizione

Con le informazioni acquisite sulla risorsa macchina virtuale, è possibile usare la proprietà location per eseguire il conteggio di tutte le macchine virtuali in base alla posizione. Per aggiornare la query, rimuovere il limite e riepilogare il conteggio dei valori delle posizioni.

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à della macchina virtuale originale, tentare di trovare tutte le macchine virtuali il cui SKU ha dimensioni pari a Standard_B2s. Il codice JSON restituito mostra che il valore è archiviato in properties.hardwareprofile.vmsize. Aggiornare la query affinché restituisca tutte le macchine virtuali con queste dimensioni indicando solo l'area e il nome della macchina virtuale.

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 affinché restituisca 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 della query precedente, esaminare le proprietà esistenti nel disco gestito 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_11111111111111111111111111111111"
  }
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'

Prima di eseguire la query, come è possibile sapere che type sarà Microsoft.Compute/disks? Se si esamina l'ID completo, si nota che /providers/Microsoft.Compute/disks/ fa 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, verrà restituito un solo record e la proprietà type in tale record fornirà 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_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

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

[
  {
    "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"
  }
]

Esplorare le macchine virtuali per trovare gli indirizzi IP pubblici

Questo set di query prima di tutto trova e archivia tutte le risorse delle schede di interfaccia 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

Nella query seguente, usare il file (interfaccia della riga di comando di Azure) o la variabile (Microsoft Azure PowerShell) per recuperare i dettagli delle risorse scheda 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, passare all'esempio Elencare macchine virtuali con l'interfaccia di rete e l'indirizzo IP pubblico.

Passaggi successivi