Usare Azure PowerShell per creare un'istanza di SQL Server in una macchina virtuale di Azure

Si applica a:SQL Server su VM Azure

Questa guida illustra le opzioni per l'uso di PowerShell per effettuare il provisioning di un'istanza di SQL Server in una macchina virtuale (VM) di Azure. Per un esempio semplificato di Azure PowerShell basato su valori predefiniti, vedere la guida di avvio rapido per PowerShell con SQL Server in macchine virtuali di Azure.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Nota

Questo articolo usa il modulo di PowerShell Azure Az consigliato per l'interazione con Azure. Per iniziare a usare il modulo Az PowerShell, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Configurare la sottoscrizione

  1. Aprire PowerShell e accedere all'account Azure eseguendo il comando Connect-AzAccount.

    Connect-AzAccount
    
  2. Quando viene richiesto, immetti le credenziali. Utilizzare lo stesso indirizzo email e password utilizzati per accedere al portale di Azure.

Definire le variabili di immagine

Per riutilizzare i valori e semplificare la creazione degli script, iniziare definendo una serie di variabili. Cambiare i valori dei parametri in base alla necessità, ma quando si modificano i valori forniti occorre prestare attenzione alle restrizioni di denominazione correlate alle lunghezze dei nomi e ai caratteri speciali.

Posizione e gruppo di risorse

Definire l'area dati e il gruppo di risorse in cui devono essere create le altre risorse per la macchina virtuale.

Modificare come desiderato e quindi eseguire questi cmdlet per inizializzare le variabili.

$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

Proprietà della risorsa di archiviazione

Definire l'account di archiviazione e il tipo di risorsa di archiviazione che devono essere usati dalla macchina virtuale.

Modificare come desiderato e quindi eseguire il comando cmdlet seguente per inizializzare le variabili. Per i carichi di lavoro di produzione è consigliabile usare unità SSD Premium.

$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

Proprietà della rete

Definire le proprietà da usare per la rete nella macchina virtuale.

  • Interfaccia di rete
  • Metodo di allocazione TCP/IP
  • Nome della rete virtuale
  • Nome della subnet virtuale
  • Intervallo di indirizzi IP per la rete virtuale
  • Intervallo di indirizzi IP per la subnet
  • Etichetta di nome di dominio pubblico

Modificare come desiderato e quindi eseguire questo cmdlet per inizializzare le variabili.

$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$TCPIPAllocationMethod = "Dynamic"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$DomainName = $ResourceGroupName

Proprietà della macchina virtuale

Definire le proprietà seguenti:

  • Virtual machine name
  • Nome del computer
  • Dimensioni della macchina virtuale
  • Nome del disco del sistema operativo per la macchina virtuale

Modificare come desiderato e quindi eseguire questo cmdlet per inizializzare le variabili.

$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

Scegliere un'immagine di SQL Server

Usare le variabili seguenti per definire l'immagine di SQL Server da usare per la macchina virtuale.

  1. Per prima cosa, visualizzare l'elenco completo delle immagini di SQL Server disponibili con il comando Get-AzVMImageOffer. Questo comando elenca le immagini correnti disponibili nel portale di Azure e anche le immagini meno recenti che possono essere installate solo con PowerShell:

    Get-AzVMImageOffer -Location $Location -Publisher 'MicrosoftSQLServer'
    

    Nota

    SQL Server 2008 e SQL Server 2008 R2 non dispongono più del supporto "Extended" e non sono più disponibili in Azure Marketplace.

  2. Per questa esercitazione, usare le variabili seguenti per specificare SQL Server 2022 in Windows Server 2022.

    $OfferName = "SQL2022-WS2022"
    $PublisherName = "MicrosoftSQLServer"
    $Version = "latest"
    
  3. Visualizzare quindi l'elenco delle edizioni disponibili per la propria offerta.

    Get-AzVMImageSku -Location $Location -Publisher 'MicrosoftSQLServer' -Offer $OfferName | Select Skus
    
  4. Per questa esercitazione, usare l'edizione SQL Server 2022 Developer (SQLDEV). L'edizione Developer è concessa in licenza gratuitamente per test e sviluppo e si paga solo il costo di esecuzione della VM.

    $Sku = "SQLDEV"
    

Creare un gruppo di risorse

Il primo oggetto creato con il modello di distribuzione Resource Manager è il gruppo di risorse. Usare il cmdlet New-AzResourceGroup per creare un gruppo di risorse di Azure e le relative risorse. Specificare le variabili inizializzate in precedenza per nome e posizione del gruppo di risorse.

Eseguire questo cmdlet per creare un nuovo gruppo di risorse.

New-AzResourceGroup -Name $ResourceGroupName -Location $Location

Creare un account di archiviazione

La macchina virtuale richiede risorse di archiviazione per il disco del sistema operativo e per i file di dati e di log di SQL Server. Per semplificare, verrà creato un singolo disco per entrambi. Successivamente è possibile collegare dischi aggiuntivi usando il cmdlet Add-Azure Disk per posizionare i file di dati e di log di SQL Server in dischi dedicati. Usare il cmdlet New-AzStorageAccount per creare un account di archiviazione standard nel nuovo gruppo di risorse. Specificare le variabili inizializzate in precedenza per nome dell'account di archiviazione, nome dello SKU di archiviazione e posizione.

Eseguire questo cmdlet per creare il nuovo account di archiviazione.

$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName `
   -Name $StorageName -SkuName $StorageSku `
   -Kind "Storage" -Location $Location

Suggerimento

La creazione dell'account di archiviazione può richiedere alcuni minuti.

Creare risorse di rete

La macchina virtuale richiede alcune risorse di rete per la connettività di rete.

  • Ogni macchina virtuale richiede una rete virtuale.
  • In una rete virtuale deve essere definita almeno una subnet.
  • È necessario che sia definita un'interfaccia di rete con un indirizzo IP pubblico o privato.

Creare una configurazione di subnet di rete virtuale

Per prima cosa, creare una configurazione di subnet per la rete virtuale. Per questa esercitazione, creare una subnet predefinita mediante il cmdlet New-AzVirtualNetworkSubnetConfig. Specificare le variabili inizializzate in precedenza per nome della subnet, posizione e prefisso dell'indirizzo.

Nota

È possibile definire altre proprietà della configurazione della subnet della rete virtuale usando questo cmdlet, ma questa operazione non rientra nell'ambito dell'esercitazione.

Eseguire questo cmdlet per creare la configurazione di subnet virtuale.

$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix

Creare una rete virtuale

Creare quindi la rete virtuale nel nuovo gruppo di risorse mediante il cmdlet New-AzVirtualNetwork. Specificare le variabili inizializzate in precedenza per nome, posizione e prefisso dell'indirizzo. Usare la configurazione di subnet definita nel passaggio precedente.

Eseguire questo cmdlet per creare la rete virtuale.

$VNet = New-AzVirtualNetwork -Name $VNetName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig

Creare l'indirizzo IP pubblico

Dopo avere definito la rete virtuale, è necessario configurare un indirizzo IP per la connettività alla macchina virtuale. Per questa esercitazione, creare un indirizzo IP pubblico mediante indirizzi IP dinamici per supportare la connettività Internet. Usare il cmdlet New-AzPublicIpAddress per creare l'indirizzo IP pubblico nel nuovo gruppo di risorse. Specificare le variabili inizializzate in precedenza per nome, posizione, metodo di allocazione ed etichetta del nome di dominio DNS.

Nota

È possibile definire altre proprietà dell'indirizzo IP pubblico usando questo cmdlet, ma questa operazione non rientra nell'ambito dell'esercitazione. È anche possibile creare un indirizzo privato o un indirizzo di tipo statico, ma anche questa procedura non rientra nell'ambito dell'esercitazione.

Eseguire questo cmdlet per creare l'indirizzo IP pubblico.

$PublicIp = New-AzPublicIpAddress -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName

Creare il gruppo di sicurezza di rete

Per proteggere la macchina virtuale e il traffico di SQL Server, creare un gruppo di sicurezza di rete.

  1. Per prima cosa, creare una regola del gruppo di sicurezza di rete per desktop remoto (RDP) in modo da consentire le connessioni RDP.

    $NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp `
       -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
    
  2. Configurare una regola del gruppo di sicurezza di rete che consenta il traffico sulla porta TCP 1433, in modo da permettere connessioni a SQL Server tramite Internet.

    $NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp `
       -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
    
  3. Creare il gruppo di sicurezza di rete.

    $Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName `
       -Location $Location -Name $NsgName `
       -SecurityRules $NsgRuleRDP,$NsgRuleSQL
    

Creare l'interfaccia di rete

È ora possibile creare l'interfaccia di rete per la macchina virtuale. Usare il cmdlet New-AzNetworkInterface per creare l'interfaccia di rete nel nuovo gruppo di risorse. Specificare il nome, la posizione, la subnet e l'indirizzo IP pubblico definiti in precedenza.

Eseguire questo cmdlet per creare l'interfaccia di rete.

$Interface = New-AzNetworkInterface -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id `
   -NetworkSecurityGroupId $Nsg.Id

Configurare un oggetto VM

Dopo avere definito le risorse di archiviazione e di rete, è possibile definire le risorse di calcolo per la macchina virtuale.

  • Specificare le dimensioni della macchina virtuale e varie proprietà del sistema operativo.
  • Specificare l'interfaccia di rete creata in precedenza.
  • Definire l'archivio BLOB.
  • Specificare il disco del sistema operativo.

Creare l'oggetto macchina virtuale

Specificare prima di tutto le dimensioni della macchina virtuale. Per questa esercitazione, specificare DS13. Usare il cmdlet New-AzVMConfig per creare un oggetto macchina virtuale configurabile. Specificare le variabili inizializzate in precedenza per nome e dimensioni.

Eseguire questo cmdlet per creare l'oggetto macchina virtuale.

$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize

Creare un oggetto credenziali per includere il nome e la password per le credenziali di amministratore locale

Prima che sia possibile configurare le proprietà del sistema operativo per la macchina virtuale, è necessario specificare le credenziali per l'account di amministratore locale sotto forma di stringa sicura. Per eseguire questa operazione usare il cmdlet Get-Credential.

Eseguire il cmdlet seguente. Sarà necessario digitare il nome e la password dell'amministratore locale della macchina virtuale nella finestra di richiesta delle credenziali di PowerShell.

$Credential = Get-Credential -Message "Type the name and password of the local administrator account."

Configurare le proprietà del sistema operativo per la macchina virtuale

A questo punto, è possibile impostare le proprietà del sistema operativo della macchina virtuale con il cmdlet Set-AzVMOperatingSystem.

  • Impostare il tipo di sistema operativo Windows.
  • Richiedere l'installazione dell'agente per la macchina virtuale.
  • Specificare che il cmdlet abilita l'aggiornamento automatico.
  • Specificare le variabili inizializzate in precedenza per il nome della macchina virtuale, il nome del computer e le credenziali.

Eseguire questo cmdlet per configurare le proprietà del sistema operativo per la macchina virtuale.

$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine `
   -Windows -ComputerName $ComputerName -Credential $Credential `
   -ProvisionVMAgent -EnableAutoUpdate

Aggiungere l'interfaccia di rete alla macchina virtuale

Successivamente, usare il cmdlet Add-AzVMNetworkInterface per aggiungere l'interfaccia di rete usando la variabile definita in precedenza.

Eseguire questo cmdlet per configurare l'interfaccia di rete per la macchina virtuale.

$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id

Impostare la posizione dell'archivio BLOB per il disco da usare per la macchina virtuale

A questo punto, impostare la posizione dell'archiviazione BLOB per il disco della macchina virtuale specificando le variabili definite in precedenza.

Eseguire questo cmdlet per impostare la posizione dell'archivio BLOB.

$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"

Configurare le proprietà del disco del sistema operativo per la macchina virtuale

Configurare quindi le proprietà del disco del sistema operativo per la macchina virtuale usando il cmdlet Set-AzVMOSDisk.

  • Specificare che il sistema operativo per la macchina virtuale verrà da un'immagine.
  • Impostare la memorizzazione nella cache sulla modalità di sola lettura, perché SQL Server viene installato nello stesso disco.
  • Specificare le variabili inizializzate in precedenza per nome della macchina virtuale e disco del sistema operativo.

Eseguire questo cmdlet per configurare le proprietà del disco del sistema operativo per la macchina virtuale.

$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name `
   $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

Specificare l'immagine di piattaforma per la macchina virtuale

L'ultimo passaggio della configurazione consiste nello specificare l'immagine della piattaforma per la macchina virtuale. Per questa esercitazione, usare l'immagine più recente per SQL Server 2016 CTP. Usare il cmdlet Set-AzVMSourceImage per usare questa immagine con le variabili definite in precedenza.

Eseguire questo cmdlet per specificare l'immagine della piattaforma per la macchina virtuale.

$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine `
   -PublisherName $PublisherName -Offer $OfferName `
   -Skus $Sku -Version $Version

Creare la macchina virtuale SQL

Al termine della procedura di configurazione, è possibile creare la macchina virtuale. Usare il cmdlet New-AzVM per creare la macchina virtuale usando le variabili definite.

Suggerimento

La creazione della macchina virtuale può richiedere qualche minuto.

Eseguire questo cmdlet per creare la macchina virtuale.

New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

La creazione della macchina virtuale è stata completata.

Nota

Se si verifica un errore sulla diagnostica di avvio, è possibile ignorarlo. Viene creato un account di archiviazione standard per la diagnostica di avvio, perché l'account di archiviazione specificato per il disco della macchina virtuale è un account di archiviazione Premium.

Installare l'estensione SQL Server IaaS Agent

Le macchine virtuali di SQL Server supportano funzionalità di gestione automatica mediante l'estensione SQL Server IaaS Agent. Per registrare l'istanza di SQL Server con l'estensione, eseguire il comando New-AzSqlVM dopo la creazione della macchina virtuale. Specificare il tipo di licenza per la macchina virtuale di SQL Server, scegliendo tra il tipo con pagamento in base al consumo e il tipo Bring Your Own License tramite il Vantaggio Azure Hybrid. Per altre informazioni sulle licenze, vedere Modello di licenza.

New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

Esistono tre modi per eseguire la registrazione con l'estensione:

Arrestare o rimuovere una macchina virtuale

Se non è necessario che la macchina virtuale sia continuamente in esecuzione, è possibile evitare addebiti superflui arrestandola quando non è in uso. Il comando seguente arresta la VM ma la lascia disponibile per un uso futuro.

Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

È anche possibile eliminare definitivamente tutte le risorse associate alla macchina virtuale con il comando Remove-AzResourceGroup. In questo modo viene eliminata definitivamente anche la macchina virtuale, quindi usare questo comando con cautela.

Script di esempio

Lo script seguente contiene lo script PowerShell completo per l'esercitazione. Si presuppone che sia già stata impostata la sottoscrizione di Azure da usare con i comandi Connect-AzAccount e Select-AzSubscription.

# Variables

## Global
$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

## Storage
$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

## Network
$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$TCPIPAllocationMethod = "Dynamic"
$DomainName = $ResourceGroupName

##Compute
$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

##Image
$PublisherName = "MicrosoftSQLServer"
$OfferName = "SQL2017-WS2016"
$Sku = "SQLDEV"
$Version = "latest"

# Resource Group
New-AzResourceGroup -Name $ResourceGroupName -Location $Location

# Storage
$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageName -SkuName $StorageSku -Kind "Storage" -Location $Location

# Network
$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix
$VNet = New-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName -Location $Location -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig
$PublicIp = New-AzPublicIpAddress -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName
$NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
$NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
$Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName -Location $Location -Name $NsgName -SecurityRules $NsgRuleRDP,$NsgRuleSQL
$Interface = New-AzNetworkInterface -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id -NetworkSecurityGroupId $Nsg.Id

# Compute
$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize
$Credential = Get-Credential -Message "Type the name and password of the local administrator account."
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $ComputerName -Credential $Credential -ProvisionVMAgent -EnableAutoUpdate #-TimeZone = $TimeZone
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id
$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

# Image
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName $PublisherName -Offer $OfferName -Skus $Sku -Version $Version

# Create the VM in Azure
New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

# Add the SQL IaaS Agent Extension, and choose the license type
New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

Passaggi successivi

Dopo aver creato la macchina virtuale, è possibile: