Installare e configurare PowerShell Desired State Configuration for Linux

Panoramica

PowerShell Desired State Configuration, più semplicemente conosciuta come PowerShell DSC, è una piattaforma utilizzabile all’interno di Windows PowerShell, che permette di eseguire alcune operazioni di configurazione su delle macchine definite “Target”. I Target possono essere server singoli o gruppi di server, o anche semplici client. Tramite questa funzionalità è possibile esaminare la configurazione attuale di un sistema, confrontarla con un modello, ed eseguire in maniera automatica le operazioni per allineare il sistema a quel modello. PowerShell DSC è in grado di effettuare molte operazioni al fine di rendere la configurazione compatibile con il modello, tra cui:

  • Gestione di file e cartelle
  • Installazione e rimozione di ruoli e funzionalità
  • Gestione gruppi e utenti
  • Esecuzione di script PowerShell

E’ possibile utilizzare DSC per automatizzare la configurazione anche di ambienti complessi, per poterli facilmente replicare ad esempio in siti diversi; esistono, a tal proposito, repository come PowerShell Gallery (https://www.powershellgallery.com/) dove è possibile scaricare delle configurazioni già pronte, da applicare ad ambienti diversi.

La distribuzione delle configurazioni avviene tramite un server di pull, che oltre a comandare l’esecuzione dei vari script e dare il via al cambio di configurazione delle macchine, si occupa di generare dei report sullo stato delle macchine stesse, ed aiutare quindi l’amministratore a monitorare il sistema in tempo reale.

PowerShell DSC è stata introdotta con Windows 2012 R2 ma può essere utilizzata su sistemi precedenti implementando Windows Management Framework (WMF). In ogni caso è necessario disporre di PowerShell almeno versione 4.

Con l’introduzione di PowerShell for Linux, a partire da Maggio 2015, Desired State Configuration è disponibile anche su questo sistema operativo; è possibile quindi attraverso il server di pull gestire sia macchine Windows che macchine Linux. Proviamo ad installarlo e comprenderne un po’ le potenzialità.

Prerequisito fondamentale per l’utilizzo di PowerShell DSC su Linux è l’installazione di Open Management Infrastructure (OMI), un sistema di management per dispositivi di Networking, Server, Stampanti, ecc… che comunica con i protocolli CIM e WSMAN. Non entreremo troppo nel dettaglio del funzionamento di questi protocolli, ma diamo per assodato che si tratta di un sistema che si propone di diventare uno standard universale per il management di qualsiasi tipo di macchina, sia esso un computer, un server, un apparato di rete o una periferica.

Altri prerequisiti per il funzionamento di Linux DSC sono:

  • glibc almeno v2.4
  • python almeno v2.4
  • openssl OpenSSL v0.9.8 o v1.0
  • ctypes stessa versione di python
  • libcurl v7.15.1

La macchina Linux utilizzata per i test e gli screenshot relativi a questo articolo è una CentOS 7, quindi tutti i comandi e i percorsi utilizzati si riferiscono a questa distribuzione. In particolare la macchina utilizzata ha IP 192.168.12.10; ogni volta che sarà indicato questo indirizzo IP all’interno di una configurazione sappiamo quindi che ci stiamo riferendo alla nostra macchina Linux. Per distribuzioni diverse da CentOS sarà ovviamente necessario utilizzare i percorsi ed i package manager corrispondenti.

PowerShell DSC è supportato infatti anche su altre distribuzioni. La pagina di riferimento su GitHub ad oggi riporta che è possibile installare questa funzionalità su:

  • CentOS 5, 6, and 7 (x86/x64)
  • Debian GNU/Linux 6 and 7 (x86/x64)
  • Oracle Linux 5, 6 and 7 (x86/x64)
  • Red Hat Enterprise Linux Server 5, 6 and 7 (x86/x64)
  • SUSE Linux Enterprise Server 10, 11 and 12 (x86/x64)
  • Ubuntu Server 12.04 LTS and 14.04 LTS (x86/x64)

Partiamo quindi dall’installazione dei prerequisiti; un’unica istruzione yum installerà tutti i pacchetti eventualmente mancanti ed aggiornerà quelli obsoleti:

yum install glibc python openssl python-ctypes libcurl

Passiamo ora all’installazione di Open Management Infrastructure (OMI) versione 1.0.8.4 (l’ultima al momento della stesura dell’articolo)

In primo luogo verifichiamo quale versione di openssl è installata sul nostro sistema con

openssl version

e cerchiamo sulla pagina del progetto https://github.com/Microsoft/omi/releases il pacchetto relativo all’architettura e alla versione di openssl in uso

Nel nostro caso l’ultima versione è la 1.1.0, siamo su una macchina a 64bit con ssl 1.0

cd /usr/local/src
wget https://github.com/Microsoft/omi/releases/download/v1.1.0-0/omi-1.1.0.ssl_100.x64.rpm

Installiamo il pacchetto
rpm -ivh omi-1.1.0.ssl_100.x64.rpm


Ora siamo pronti per installare DSC for Linux; iniziamo scaricando l’ultima versione disponibile da qui https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases/latest

Avendo cura di scegliere anche qui la versione relativa all’architettura e alla versione di Openssl in uso

Al momento troviamo versione 1.1.1-294 e possiamo scaricarla ed installarla con:

wget https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases/download/v1.1.1-294/dsc-1.1.1-294.ssl_100.x64.rpm
rpm -ivh dsc-1.1.1-294.ssl_100.x64.rpm


Installato tutto il necessario possiamo procedere alla configurazione dei servizi per iniziare ad utilizzare DSC for Linux. Per prima cosa è necessario lanciare omiserver come servizio, o come preferiscono chiamarlo i seguaci di Linux, come demone. Per fare ciò lanciamo l’eseguibile di omiserver con l’opzione –d

/opt/omi/bin/omiserver –d

Successivamente è fondamentale copiare i moduli di Linux DSC sul server Windows da cui poi effettueremo la connessione (e quindi il push della configurazione), o installare i moduli per il management delle macchine Linux direttamente da PowerShell.

Con Windows 10 Anniversary Update o Windows 2016 sarà sufficiente eseguire il comando

Install-Module nx, nxComputerManagement, nxNetworking

Su sistemi operativi precedenti, è possibile procedere alla copia manuale delle “risorse nx” presenti nella cartella “Modules”

Potete ovviamente utilizzare il metodo che preferite, io ho usato WINSCP scaricandolo da

https://winscp.net/download/WinSCP-5.9.2-Portable.zip

WinSCP è un client di trasferimento con protocollo SCP, è in grado quindi di trasferire file da e verso una macchina Linux da Windows sfruttando una connessione SSH. Nel nostro caso stabiliamo la connessione e copiamo la cartella nx come segue:

dalla macchina Linux dal percorso /opt/microsoft/dsc/modules/nx
nella macchina Windows nel percorso C:\Windows\System32\WindowsPowerShell\v1.0\Modules

Avviando PowerShell da Windows possiamo verificare che siano presenti i moduli per il management dei client linux eseguendo il cmd-let

Get-DSCResource nx*

Ora è davvero tutto pronto per provare a stabilire una connessione con la macchina linux, creare un file di configurazione, ed inviarlo al client per avviare il deploy automatico delle risorse.

Per effettuare il push della configurazione è necessario creare da Windows Powershell una connessione con la macchina Linux e per questo utilizzeremo una CIM Session. Questa operazione si esegue con poche righe direttamente da PowerShell; abbiate cura ovviamente di sostituire l’indirizzo IP con quello desiderato al momento di aprire la connessione tramite il comando New.CimSession.

$RootCredentials = Get-Credential -UserName:'root' -Message 'Root Credentials'

$CIMOptions = New-CimSessionOption -SkipCACheck -SkipCNCheck -UseSsl -SkipRevocationCheck

$CIMSession = New-CimSession -Credential $RootCredentials -ComputerName '192.168.12.10' -Port 5986 -Authentication Basic -SessionOption $CIMOptions

Una messagebox chiederà di immettere la password per connetterci alla macchina linux, dal momento che abbiamo indicato -Message ‘Root Credentials’ nel comando Get-Credentials. Avremmo potuto specificare la password direttamente nello script, ma sarebbe stata visibile in chiaro e questa soluzione non mi piace molto.

Inserita la password, se PowerShell non ritorna errori la connessione è andata a buon fine.

Rimbocchiamoci le maniche, quindi, e scriviamo il nostro primo file di configurazione per PowerShell DSC. In questo esempio proveremo ad eseguire il push di una configurazione che mi piace definire “semplice ma non troppo”; proveremo, infatti, a lanciare l’autoconfigurazione di LAMP sulla macchina linux. Il sistema effettuerà l’installazione in autonomia del servizio Apache con supporto PHP e del servizio MariaDB (MySQL), effettuando il download dei servizi e di eventuali prerequisiti utilizzando il gestore dei pacchetti yum; procederà poi all’avvio dei servizi e creerà un file php nella home directory di Apache.

Per creare il file di configurazione utilizziamo l’editor ise e salviamo il file in formato .ps1 in modo da poterlo eseguire direttamente da PowerShell. Incolliamo il seguente codice per testarne le funzionalità. Nel mio caso salvo il file in:

C:\DSCTest\LAMP-on-192-168-12-10.ps1

configuration LAMP

{

    Import-DSCResource -Module nx
Import-DSCResource -Module nxComputerManagement
Import-DSCResource -Module nxNetworking
node <192.168.12.10>

    {
nxPackage Apache
{

            PackageManager = 'Yum'
Ensure = 'Present'
Name = 'httpd'
}

        nxPackage MariaDB
{
PackageManager = 'Yum'
Ensure = 'Present'
Name = 'mariadb-server'
}

        nxPackage PHP
{
DependsOn = '[nxPackage]Apache'
PackageManager = 'Yum'
Ensure = 'Present'
Name = 'php php-mysql'
}

        nxService Apache
{
DependsOn = '[nxPackage]Apache'
Name = 'httpd'
Enabled = $true
Controller = 'systemd'
State = 'Running'
}

        nxService MariaDB
{
DependsOn = '[nxPackage]MariaDB'
Name = 'mariadb'
Enabled = $true
Controller = 'systemd'
State = 'Running'
}

        nxFile PHPTest
{
DependsOn = '[nxPackage]Apache'
Ensure = 'Present'
Type = 'File'
DestinationPath = '/var/www/html/index.php'
Contents = "<?php phpinfo(); ?>"
}
}
}

LAMP

$RootCredentials = Get-Credential -UserName:'root' -Message 'Root Credentials'

$CIMOptions = New-CimSessionOption -SkipCACheck -SkipCNCheck -UseSsl -SkipRevocationCheck

$CIMSession = New-CimSession -Credential $RootCredentials -ComputerName '192.168.12.10' -Port 5986 -Authentication Basic -SessionOption $CIMOptions

Start-DscConfiguration -CimSession $CIMSession -Wait -Verbose -Path c:\DSCTest\LAMP

Get-DscConfiguration -CimSession $CIMSession

Test-DscConfiguration -CimSession:$CIMSession

Durante l’esecuzione verrà generato un file .MOF in una sottocartella chiamata come il nome dichiarato all’interno del file di configurazione. Nel nostro caso, lanciando lo script PowerShell da c:\DSCTest, il file MOF verrà creato n c:\DSCTest\LAMP. E’ questo, quindi, il percorso da indicare nel parametro Path del comando Start-DscConfiguration nelle ultime righe dello script.

Proviamo quindi a posizionarci in c:\DSCTest, lanciare lo script ed osservare cosa succede.

Il Cmd-let Test-DscConfiguration come ultimo comando esegue un test della configurazione e restituisce il risultato. Nel nostro caso tutto è andato come sperato e non abbiamo errori.

Dato che DSC ci ha confermato di aver creato nella root directory del webserver un file chiamato index.php che esegue il comando phpinfo, proviamo a puntare un browser su http://192.168.12.10 e vediamo se l’installazione è andata davvero a buon fine.

Direi che non abbiamo molto altro da aggiungere, non ci rimane che provare ad affinare i nostri script per ottenere praticamente ogni tipo di configurazione possibile, e divertirci a creare intere farm gestendo tutti i servizi con semplici script.