Configurare indirizzi IP privati per una macchina virtuale mediante PowerShell

Le macchine virtuali IaaS e le istanze del ruolo PaaS in una rete virtuale ricevono automaticamente un indirizzo IP privato da un intervallo specificato, in base alla subnet a cui sono connessi. Tale indirizzo viene mantenuto per le macchine virtuali e le istanze del ruolo, fino a quando non vengono rimosse. Disabilitare un'istanza di macchina virtuale o un ruolo interrompendolo da PowerShell, CLI Azure o dal portale di Azure. In questi casi, una volta che l'istanza di macchina virtuale o del ruolo viene riavviata, riceverà un indirizzo IP disponibile dall'infrastruttura di Azure, che potrebbe non essere lo stesso che aveva in precedenza. Se si arresta la macchina virtuale o l’istanza del ruolo dal sistema operativo guest, esso mantiene comunque il suo indirizzo IP.

In alcuni casi, si desidera che una macchina virtuale o istanza del ruolo disponga di un indirizzo IP statico, ad esempio, se la macchina virtuale eseguirà DNS o sarà un controller di dominio. È possibile farlo impostando un indirizzo IP statico privato.

Azure offre due modelli di distribuzione, ovvero Azure Resource Manager e la distribuzione classica. Microsoft consiglia di creare le risorse tramite il modello di distribuzione Resource Manager. Per altre informazioni sulle differenze tra i due modelli, leggere l'articolo Understand Azure deployment models (Informazioni sui modelli di distribuzione di Azure). Questo articolo illustra il modello di distribuzione Gestione risorse. È anche possibile gestire un indirizzo IP statico privato nel modello di distribuzione classico.

Scenario

Per illustrare meglio come configurare un indirizzo IP statico per una macchina virtuale, in questo documento verrà utilizzato lo scenario seguente.

Scenario di una rete virtuale

In questo scenario si creerà una macchina virtuale denominata DNS01 nella subnet FrontEnd e la si imposterà in modo che usi l'indirizzo IP statico 192.168.1.101.

I comandi di esempio PowerShell riportati di seguito prevedono un ambiente semplice già creato in base allo scenario precedente. Se si desidera eseguire i comandi illustrati in questo documento, creare innanzitutto l'ambiente di prova descritto in creare una rete virtuale.

Creare una VM con un indirizzo IP privato statico

Per creare una VM denominata DNS01 nella subnet FrontEnd di una rete virtuale denominata TestVNet con un indirizzo IP statico privato di 192.168.1.101, seguire la procedura seguente:

  1. Impostare le variabili per l'account di archiviazione, il percorso, il gruppo di risorse e le credenziali da utilizzare. È necessario immettere un nome utente e una password per la macchina virtuale. L’account di archiviazione e il gruppo di risorse deve esistere già.

    $stName  = "vnetstorage"
    $locName = "Central US"
    $rgName  = "TestRG"
    $cred    = Get-Credential -Message "Type the name and password of the local administrator account."
    
  2. Recuperare la rete virtuale e la subnet che si desidera creare nella macchina virtuale.

    $vnet   = Get-AzureRmVirtualNetwork -ResourceGroupName TestRG -Name TestVNet
    $subnet = $vnet.Subnets[0].Id
    
  3. Se necessario, creare un indirizzo IP pubblico per accedere alla macchina virtuale da Internet.

    $pip = New-AzureRmPublicIpAddress -Name TestPIP -ResourceGroupName $rgName `
    -Location $locName -AllocationMethod Dynamic
    
  4. Creare una scheda di rete utilizzando l'indirizzo IP privato statico da assegnare alla macchina virtuale. Assicurarsi che l'indirizzo IP venga dall'intervallo di subnet che si aggiunge alla macchina virtuale. Questo è il passaggio principale di questo articolo, in cui si imposta l’IP privato che deve essere statico.

    $nic = New-AzureRmNetworkInterface -Name TestNIC -ResourceGroupName $rgName `
    -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id `
    -PrivateIpAddress 192.168.1.101
    
  5. Creare la macchina virtuale utilizzando la scheda di rete creata in precedenza.

    $vm = New-AzureRmVMConfig -VMName DNS01 -VMSize "Standard_A1"
    $vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName DNS01 `
    -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
    $vm = Set-AzureRmVMSourceImage -VM $vm -PublisherName MicrosoftWindowsServer `
    -Offer WindowsServer -Skus 2012-R2-Datacenter -Version "latest"
    $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
    $osDiskUri = $storageAcc.PrimaryEndpoints.Blob.ToString() + "vhds/WindowsVMosDisk.vhd"
    $vm = Set-AzureRmVMOSDisk -VM $vm -Name "windowsvmosdisk" -VhdUri $osDiskUri `
    -CreateOption fromImage
    New-AzureRmVM -ResourceGroupName $rgName -Location $locName -VM $vm 
    

    Output previsto:

     EndTime             : [Date and time]
     Error               : 
     Output              : 
     StartTime           : [Date and time]
     Status              : Succeeded
     TrackingOperationId : [Id]
     RequestId           : [Id]
     StatusCode          : OK 
    

Recuperare le informazioni relative all'indirizzo IP privato statico per un'interfaccia di rete

Per visualizzare le informazioni relative all'indirizzo IP privato statico per la macchina virtuale creata con lo script precedente, eseguire il comando PowerShell seguente e osservare i valori per PrivateIpAddress e PrivateIpAllocationMethod:

Get-AzureRmNetworkInterface -Name TestNIC -ResourceGroupName TestRG

Output previsto:

Name                 : TestNIC
ResourceGroupName    : TestRG
Location             : centralus
Id                   : /subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNIC
Etag                 : W/"[Id]"
ProvisioningState    : Succeeded
Tags                 : 
VirtualMachine       : {
                         "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Compute/virtualMachines/DNS01"
                       }
IpConfigurations     : [
                         {
                           "Name": "ipconfig1",
                           "Etag": "W/\"[Id]\"",
                           "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNIC/ipConfigurations/ipconfig1",
                           "PrivateIpAddress": "192.168.1.101",
                           "PrivateIpAllocationMethod": "Static",
                           "Subnet": {
                             "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/virtualNetworks/TestVNet/subnets/FrontEnd"
                           },
                           "PublicIpAddress": {
                             "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/publicIPAddresses/TestPIP"
                           },
                           "LoadBalancerBackendAddressPools": [],
                           "LoadBalancerInboundNatRules": [],
                           "ProvisioningState": "Succeeded"
                         }
                       ]
DnsSettings          : {
                         "DnsServers": [],
                         "AppliedDnsServers": [],
                         "InternalDnsNameLabel": null,
                         "InternalFqdn": null
                       }
EnableIPForwarding   : False
NetworkSecurityGroup : null
Primary              : True

Rimuovere un indirizzo IP privato statico da un'interfaccia di rete

Per rimuovere l'indirizzo IP privato statico aggiunto alla macchina virtuale nello script precedente, eseguire il comando PowerShell seguente:

$nic=Get-AzureRmNetworkInterface -Name TestNIC -ResourceGroupName TestRG
$nic.IpConfigurations[0].PrivateIpAllocationMethod = "Dynamic"
Set-AzureRmNetworkInterface -NetworkInterface $nic

Output previsto:

Name                 : TestNIC
ResourceGroupName    : TestRG
Location             : centralus
Id                   : /subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNIC
Etag                 : W/"[Id]"
ProvisioningState    : Succeeded
Tags                 : 
VirtualMachine       : {
                         "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Compute/virtualMachines/WindowsVM"
                       }
IpConfigurations     : [
                         {
                           "Name": "ipconfig1",
                           "Etag": "W/\"[Id]\"",
                           "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNIC/ipConfigurations/ipconfig1",
                           "PrivateIpAddress": "192.168.1.101",
                           "PrivateIpAllocationMethod": "Dynamic",
                           "Subnet": {
                             "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/virtualNetworks/TestVNet/subnets/FrontEnd"
                           },
                           "PublicIpAddress": {
                             "Id": "/subscriptions/[Id]/resourceGroups/TestRG/providers/Microsoft.Network/publicIPAddresses/TestPIP"
                           },
                           "LoadBalancerBackendAddressPools": [],
                           "LoadBalancerInboundNatRules": [],
                           "ProvisioningState": "Succeeded"
                         }
                       ]
DnsSettings          : {
                         "DnsServers": [],
                         "AppliedDnsServers": [],
                         "InternalDnsNameLabel": null,
                         "InternalFqdn": null
                       }
EnableIPForwarding   : False
NetworkSecurityGroup : null
Primary              : True

Aggiungere un indirizzo IP privato statico a un'interfaccia di rete

Per aggiungere un indirizzo IP privato statico alla macchina virtuale creata usando lo script precedente, eseguire i comandi seguenti:

$nic=Get-AzureRmNetworkInterface -Name TestNIC -ResourceGroupName TestRG
$nic.IpConfigurations[0].PrivateIpAllocationMethod = "Static"
$nic.IpConfigurations[0].PrivateIpAddress = "192.168.1.101"
Set-AzureRmNetworkInterface -NetworkInterface $nic

Modificare il metodo di allocazione per un indirizzo IP privato assegnato a un'interfaccia di rete

Un indirizzo IP privato viene assegnato a una scheda di interfaccia di rete con il metodo di allocazione statico o dinamico. Gli indirizzi IP dinamici possono cambiare dopo l'avvio di una VM che in precedenza era in stato di arresto (deallocazione). Questo può causare problemi se la VM ospita un servizio che richiede lo stesso indirizzo IP, anche dopo il riavvio da uno stato di arresto (deallocazione). Gli indirizzi IP statici vengono mantenuti fino a quando non viene eliminata la VM. Per cambiare il metodo di allocazione di un indirizzo IP, eseguire lo script seguente, che cambia il metodo di allocazione da dinamico in statico. Se il metodo di allocazione per l'indirizzo IP privato corrente è statico, cambiare Static in Dynamic prima di eseguire lo script.

$RG = "TestRG"
$NIC_name = "testnic1"

$nic = Get-AzureRmNetworkInterface -ResourceGroupName $RG -Name $NIC_name
$nic.IpConfigurations[0].PrivateIpAllocationMethod = 'Static'
Set-AzureRmNetworkInterface -NetworkInterface $nic 
$IP = $nic.IpConfigurations[0].PrivateIpAddress

Write-Host "The allocation method is now set to"$nic.IpConfigurations[0].PrivateIpAllocationMethod"for the IP address" $IP"." -NoNewline

Se non si conosce il nome della scheda di interfaccia di rete, è possibile visualizzare un elenco delle schede di rete all'interno di un gruppo di risorse immettendo il comando seguente:

Get-AzureRmNetworkInterface -ResourceGroupName $RG | Where-Object {$_.ProvisioningState -eq 'Succeeded'} 

Passaggi successivi