Usare PowerShell DSC per ottenere uno stato desiderato
È possibile usare PowerShell DSC per specificare lo stato desiderato di una macchina virtuale. In questa unità si otterranno maggiori informazioni su PowerShell DSC e su come usarlo per controllare lo stato delle macchine virtuali. Nello scenario di esempio, verrà usato PowerShell DSC per verificare che IIS per Windows Server sia installato e configurato in modo coerente in tutti i server Web.
Al termine di questa unità, si sarà in grado di:
- Comprendere i blocchi nodo e i blocchi configurazione.
- Comprendere gli asset delle credenziali.
- Scrivere codice PowerShell DSC per installare Microsoft IIS in modo idempotente.
Risorse DSC
È stato illustrato come PowerShell DSC costituisca un linguaggio di scripting dichiarativo. La programmazione dichiarativa è incentrata sul risultato, non sul percorso. Quando occorre configurare e distribuire una risorsa di Azure in modo coerente in un set di VM, PowerShell DSC può essere di aiuto. PowerShell DSC viene usato anche quando non si ha familiarità con i passaggi tecnici necessari per installare e configurare il software e i servizi.
Windows Server dispone di un set di risorse PowerShell DSC predefinite. È possibile visualizzare queste risorse eseguendo il cmdlet di PowerShell Get-DSCResource
.
Get-DscResource | select Name,Module,Properties
La tabella seguente elenca alcune delle risorse PowerShell DSC predefinite.
Risorsa | Descrizione |
---|---|
file | Gestisce file e cartelle in un nodo |
Archivio | Decomprime un archivio nel formato zip |
Ambiente | Gestisce le variabili di ambiente di sistema |
Log | Scrive un messaggio nel registro eventi DSC |
Pacchetto | Installa o rimuove un pacchetto |
Registro | Gestisce la chiave del Registro di sistema di un nodo (eccetto HKEY Users) |
Script | Esegue i comandi di PowerShell in un nodo |
Servizioo | Gestisce i servizi di Windows |
User | Gestisce gli utenti locali in un nodo |
WindowsFeature | Aggiunge o rimuove un ruolo o una funzionalità in un nodo |
WindowsOptionalFeature | Aggiunge o rimuove un ruolo o una funzionalità facoltativa in un nodo |
WindowsProcess | Gestisce un processo di Windows |
Per risorse più complesse, come l'integrazione di Active Directory, usare il Resource Kit di DSC che viene aggiornato su base mensile. È possibile trovare un collegamento al Resource Kit di DSC nell'unità Riepilogo alla fine di questo modulo.
La risorsa da configurare deve già far parte della VM o dell'immagine della VM. In caso contrario, la compilazione e l'esecuzione del processo avranno esito negativo.
Anatomia di un blocco di codice DSC
Un blocco di codice DSC contiene quattro sezioni. Usare l'esempio seguente per esaminarle più in dettaglio. Nell'esempio seguente i numeri non fanno parte della sintassi, Vengono indicati come commenti e fanno riferimento a sezioni della discussione che segue.
Configuration MyDscConfiguration { ##1
Node "localhost" { ##2
WindowsFeature MyFeatureInstance { ##3
Ensure = 'Present'
Name = 'Web-Server'
}
}
}
MyDscConfiguration -OutputPath C:\temp\ ##4
La sintassi di configurazione include le sezioni seguenti:
Configuration (Configurazione): il blocco configurazione è il blocco di script più esterno. Inizia con la parola chiave
Configuration
e occorrerà specificare un nome. In questo esempio il nome della configurazione èMyDscConfiguration
.Il blocco configurazione descrive la configurazione desiderata. Si pensi a un blocco configurazione come a una funzione, con la differenza che contiene una descrizione delle risorse da installare invece del codice per installarle.
Analogamente a una funzione di PowerShell, un blocco configurazione può accettare parametri. Ad esempio, si possono impostare parametri per il nome del nodo.
Configuration MyDscConfiguration { param ( [string] $ComputerName='localhost' ) Node $ComputerName { ... }
Node (Nodo): è possibile avere uno o più blocchi nodo. Il blocco nodo determina i nomi dei file con estensione mof che vengono generati quando si compila la configurazione. Ad esempio, il nome del nodo
localhost
genera un solo file localhost.mof, ma è possibile inviare tale file .mof a qualsiasi server. Quando si usano più nomi di nodi, si generano più file con estensione mof.Usare la notazione di matrice nel blocco nodo per fare riferimento a più host. Ad esempio:
Node @('WEBSERVER1', 'WEBSERVER2', 'WEBSERVER3')
Risorsa: è possibile usare uno o più blocchi di risorse per specificare le risorse da configurare. In questo caso un singolo blocco risorsa fa riferimento alla risorsa
WindowsFeature
. La risorsaWindowsFeature
garantisce che la funzionalità WindowsWeb-Server
sia installata.MyDscConfiguration: questa chiamata richiama il blocco
MyDscConfiguration
. È come l'esecuzione di una funzione. Quando si esegue un blocco configurazione, questo viene compilato in un documento Managed Object Format (MOF). MOF è un linguaggio compilato creato da Desktop Management Task Force, basato sul linguaggio di definizione dell'interfaccia.Per ogni nodo elencato nello script DSC, viene creato un file con estensione mof nella cartella specificata con il parametro
-OutputPath
.
Dati di configurazione in uno script DSC
In un blocco di dati di configurazione è possibile specificare i dati che potrebbero essere richiesti per il processo di configurazione. Questi dati possono essere applicati ai nodi denominati o a livello globale in tutti i nodi.
Un blocco di dati di configurazione è un blocco denominato che contiene una matrice di nodi. La matrice deve essere denominata AllNodes
. All'interno della matrice AllNodes
specificare i dati per un nodo usando la variabile NodeName
.
Usando lo scenario precedente, supponiamo che nel server Web installato in ogni nodo si voglia impostare la proprietà SiteName
su valori diversi. È possibile definire un blocco di dati di configurazione analogo al seguente:
$datablock =
@{
AllNodes =
@(
@{
NodeName = "WEBSERVER1"
SiteName = "WEBSERVER1-Site"
},
@{
NodeName = "WEBSERVER2"
SiteName = "WEBSERVER2-Site"
},
@{
NodeName = "WEBSERVER3"
SiteName = "WEBSERVER3-Site"
}
);
}
Se si vuole impostare una proprietà sullo stesso valore in ogni nodo, specificare NodeName = "*"
nella matrice AllNodes
.
Proteggere le credenziali in uno script DSC
Uno script DSC potrebbe richiedere di specificare informazioni sulle credenziali durante il processo di configurazione. Evitare di inserire le credenziali in testo non crittografato nello strumento di gestione del codice sorgente. Tenere presente invece che le configurazioni DSC in Automazione di Azure possono fare riferimento alle credenziali archiviate in un oggetto PSCredential
. È possibile definire un parametro per lo script DSC usando il tipo PSCredential
. Prima di eseguire lo script, ottenere le credenziali per l'utente, usare le credenziali per creare un nuovo oggetto PSCredential
e passare l'oggetto come parametro allo script.
Per impostazione predefinita, le credenziali non vengono crittografate nei file con estensione .mof, ma sono esposte come testo normale. Per crittografare le credenziali, usare un certificato nei dati di configurazione. La chiave privata del certificato deve essere presente nel nodo in cui si intende applicare la configurazione. I certificati vengono configurati tramite l'istanza di Gestione configurazione locale del nodo.
A partire da PowerShell 5.1, i file con estensione mof nel nodo vengono crittografati quando sono inattivi. Tutte le credenziali vengono crittografate in transito tramite WinRM.
Eseguire il push della configurazione nel nodo
Dopo aver creato un file con estensione .mof compilato per una configurazione, è possibile eseguirne il push in un nodo eseguendo il cmdlet Start-DscConfiguration
. Se si aggiunge il percorso alla directory, tutti i file con estensione mof individuati in tale directory vengono applicati al nodo:
Start-DscConfiguration -path D:\
Questo passaggio corrisponde alla modalità push oggetto dell'unità precedente.
Eseguire il pull della configurazione per i nodi
Se si hanno centinaia di VM in Azure, l'uso della modalità pull è più appropriato rispetto alla modalità push.
È possibile configurare un account di Automazione di Azure in modo che funga da servizio di pull: è sufficiente caricare la configurazione nell'account di Automazione, quindi registrare le macchine virtuali con questo account.
Prima di compilare la configurazione, importare tutti i moduli di PowerShell necessari per il processo DSC nell'account di automazione. Questi moduli definiscono come completare l'attività per ottenere lo stato desiderato.
Ad esempio, nell'unità precedente lo script DSC usa il modulo di PowerShell xSmbShare
per indicare a DSC come controllare lo stato di una condivisione file. DSC esegue automaticamente il pull dei moduli dall'account di automazione al nodo.
Il diagramma seguente illustra come configurare il servizio State Configuration di Automazione di Azure. Questa procedura verrà esaminata in dettaglio nell'unità successiva.
Per impostazione predefinita, dopo 15 minuti l'istanza di Gestione configurazione locale nella VM esegue il polling di Automazione di Azure per eventuali modifiche al file di configurazione di DSC. Tutte le modifiche apportate alle VM vengono registrate nella configurazione dello stato desiderato. Se si modifica una configurazione, è possibile caricarla nell'account di Automazione di Azure e le VM verranno riconfigurate automaticamente.
Il diagramma seguente illustra il processo di Gestione configurazione locale per gestire lo stato desiderato nella VM.
L'account di Automazione gestisce le credenziali in modo nativo. Questa modalità di gestione riduce la complessità correlata alla protezione e all'uso delle credenziali.