21/12/2024

PowerShell DSC : Automatiser l’installation des logiciels

I. DSC, l'outil au multiple facettes

Parmi les choses qu’il est possible de faire via PowerShell DSC et les ressources fournies nativement, on pourra noter qu’il est possible d’installer des logiciels de manière automatisée et, ce par l’intermédiaire de la ressource « Package ».

Il y a diverses manières de procéder à l’installation des logiciels sur ses serveurs (ou ses postes clients d’ailleurs), ou plutôt pour les mettre à jour comme ça peut être le cas pour Java. Je prends cet exemple car Java est régulièrement mis à jour notamment pour corriger des failles de sécurité, d’où l’intérêt de le mettre à jour.

Pour procéder à ce déploiement de logiciels, il existe diverses solutions comme le déploiement par GPO qui est une solution standard avec ses avantages et ses inconvénients, ou encore System Center Configuration Manager, voire même PDQ Deploy pour ne citer qu’eux. Et puis, il y a la solution PowerShell DSC qui s’avère pratique bien qu’elle ne soit pas infaillible, elle pourra rendre bien des services, d’autant plus que c’est très efficace.

II. Syntaxe de la ressource « Packages »

Avant de commencer, on va s’intéresser à la syntaxe proposée par la ressource « Package » en l’obtenant avec la commande habituelle « Get-DscResource » :

PS C:\Users\Florian\Documents> Get-DscResource -Name Package -Syntax
Package [String] #ResourceName
{
    Name = [string]
    Path = [string]
    ProductId = [string]
    [Arguments = [string]]
    [Credential = [PSCredential]]
    [DependsOn = [string[]]]
    [Ensure = [string]{ Absent | Present }]
    [LogPath = [string]]
    [PsDscRunAsCredential = [PSCredential]]
    [ReturnCode = [UInt32[]]]
}

Les arguments indispensables sont le nom (Name), le chemin pour trouver le package d’installation (Path) ainsi que le GUID associé à ce logiciel (ProductId). Pour revenir plus longuement sur le dernier argument « ProductId », il faut savoir que chaque logiciel est référencé par un GUID unique que l’on peut retrouver dans le registre d’une machine sur laquelle le logiciel est installé.

Nous allons voir dès à présent comment récupérer efficacement ce GUID concernant Java.

III. GUID du logiciel avec le SoftwareInstallManager

Sous Windows, chaque logiciel dispose d’un GUID unique qui permet d’identifier un logiciel spécifique dans sa version, ainsi on évite notamment d’installer deux fois le même logiciel. Pour repérer le GUID d’un logiciel, on peut regarder dans le registre ou alors utiliser PowerShell et notamment le module « Software Install Manager » disponible sur GitHub.

Ce module intègre de nombreuses fonctionnalités intéressantes mais il n’est pas l’objet de ce cours, alors on se contentera de l’utiliser pour récupérer le GUID du logiciel que l’on souhaite installer.

Pour télécharger le module : SoftwareInstallManager

Il suffit de l’extraire et de le placer dans le dossier de vos modules PowerShell.

Ensuite on peut l’importer afin de rendre ses commandlets utilisables :

Import-Module SoftwareInstallManager

Au passage, vous remarquerez qu’il y a de nombreux commandlets dans ce module très complet, voici un extrait non exhaustif :

import-module-softwareinstallmanager

Pour récupérer le GUID du logiciel Java qui sert de cobaye dans ce chapitre pour automatiser son installation, on va saisir la commande suivante :

Get-InstalledSoftware -Name *Java*

Voici la sortie que l’on obtient :

Contact             : http://java.com
Publisher           : Oracle Corporation
Name                : Java 8 Update 77 (64-bit)
Version             : 8.0.770.3
NoRepair            : 1
InstallDate         : 20160517
UninstallString     : MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F86418077F0}
WindowsInstaller    : 1
GUID                : {26A24AE4-039D-4CA4-87B4-2F86418077F0}
Comments            :
Size                :
URLInfoAbout        : http://java.com
InstallSource       : C:\
HelpLink            : http://java.com/help
NoModify            : 1
URLUpdateInfo       : http://java.sun.com
Readme              : [INSTALLDIR]README.txt
AuthorizedCDFPrefix :
ModifyPath          : MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F86418077F0}
VersionMajor        : 8
InstallLocation     :
VersionMinor        : 0
Language            : 1033
EstimatedSize       : 104626
HelpTelephone       :

En fait, j’ai tronqué volontairement la sortie de la commande pour prendre uniquement ce qui nous intéresse car dans la commande PowerShell j’ai cherché à matcher sur le mot « Java » dans le nom du logiciel, donc il y a également le Java Updater qui ressort.

Je précise qu’à chaque version, le GUID va être modifié, ce qui permet notamment de gérer les mises à jour des logiciels, ici Java. Le GUID « {26A24AE4-039D-4CA4-87B4-2F86418077F0} » est celui de la version « Java 8 Update 77 (64-bit) », il faudra d’ailleurs récupérer le nom exact en plus du GUID car nous utiliserons les deux informations dans le script DSC. Cette version de Java date un peu désormais... J'ai écris ce chapitre il y a quelques temps déjà, mais n'enlève rien à la logique de fonctionnement 🙂

IV. Le fichier de configuration PowerShell DSC

Venons-en maintenant à notre fichier de configuration DSC, car je suis sûr que vous l’attendez impatiemment. Voici le script et je vous détails son contenu juste après :

# PowerShell DSC
Configuration InstallSoftware {
    Import-DscResource –ModuleName PSDesiredStateConfiguration
    # Noeud localhost
    Node FloStation {
        Package Java #ResourceName
        {
            Name = "Java 8 Update 77 (64-bit)"
            Path = "C:\jre1.8.0_77_x64.msi"
            ProductId = "26A24AE4-039D-4CA4-87B4-2F86418077F0"
            #Arguments = ""
            Ensure = "Present"
        }
    }
}
# Générer fichier MOF
InstallSoftware
# Exécuter la configuration (push)
Start-DscConfiguration -Path "C:\Users\Florian\Documents\InstallSoftware\" -Wait -Verbose -Force

On crée une configuration nommée « InstallSoftware » qui utilise la ressource « Package » présente nativement dans DSC. On nommera cet appel de la ressource « Java » comme le nom du logiciel que l’on souhaite installer… Et ensuite on définit plusieurs propriétés :

- Name : Nom du logiciel ciblé

- Path : Chemin vers le fichier source pour l’installation, ici le MSI, sachez que vous pouvez le mettre sur un partage et indiquer le chemin UNC. Ce sera d’ailleurs plus simple sinon cela signifie que vous devez inclure une tâche pour copier le MSI sur chaque hôte ciblé dans la configuration DSC.

- ProductId : GUID du logiciel ciblé

- Ensure : Comme on souhaite installer le logiciel, on s’assure qu’il soit présent

Vous remarquerez que je n’ai pas utilisé le paramètre « Arguments » pour passer des arguments au MSI car ça fonctionne sans cela dans le cadre de Java. En revanche, ce sera certainement utile pour d’autres logiciels.

#### EXEMPLE DE SORTIE
#COMMENTAIRES : Effectuez l’opération « Invoquer une méthode CIM » avec les paramètres suivants : « 'methodName' = SendConfiguration
#Apply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration ».
#COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur FLOSTATION avec le SID utilisa
#teur S-1-5-21-2820392954-3603648402-3740943057-1001.
#COMMENTAIRES : L'option -Force a été spécifiée avec l'opération Stop. La configuration actuelle a été annulée.
#COMMENTAIRES : Un appel de méthode du Gestionnaire de configuration local est arrivé de l'ordinateur FLOSTATION avec le SID utilisa
#teur S-1-5-21-2820392954-3603648402-3740943057-1001.
#COMMENTAIRES : [FLOSTATION] : Gestionnaire de configuration local : [ Début  Définir  ]
#COMMENTAIRES : [FLOSTATION]: LCM:  [ Début  Ressource]  [[Package]Java]
#COMMENTAIRES : [FLOSTATION]: LCM:  [ Début  Test     ]  [[Package]Java]
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Validate-StandardArguments : le chemin d'accès était C:\jre
#1.8.0_77_x64.msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] L'extension du chemin d'accès était .msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Analyse en cours de 26A24AE4-039D-4CA4-87B4-2F86418077F0 en
# tant qu'élément identifyingNumber.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] 26A24AE4-039D-4CA4-87B4-2F86418077F0 analysé en tant qu'élé
#ment {26A24AE4-039D-4CA4-87B4-2F86418077F0}.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Ensure a pour valeur Present
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] product installation cannot be determined
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] le produit en tant que valeur booléenne a pour valeur False
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Le package Java 8 Update 77 (64-bit) n’est pas installé.
#COMMENTAIRES : [FLOSTATION]: LCM:  [ Fin    Test     ]  [[Package]Java]  en 0.4810 secondes.
#COMMENTAIRES : [FLOSTATION]: LCM:  [ Début  Définir  ]  [[Package]Java]
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Validate-StandardArguments : le chemin d'accès était C:\jre
#1.8.0_77_x64.msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] L'extension du chemin d'accès était .msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Analyse en cours de 26A24AE4-039D-4CA4-87B4-2F86418077F0 en
# tant qu'élément identifyingNumber.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] 26A24AE4-039D-4CA4-87B4-2F86418077F0 analysé en tant qu'élé
#ment {26A24AE4-039D-4CA4-87B4-2F86418077F0}.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Ensure a pour valeur Present
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] product installation cannot be determined
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] le produit en tant que valeur booléenne a pour valeur False
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Le package Java 8 Update 77 (64-bit) n’est pas installé.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Validate-StandardArguments : le chemin d'accès était C:\jre
#1.8.0_77_x64.msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] L'extension du chemin d'accès était .msi.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Analyse en cours de 26A24AE4-039D-4CA4-87B4-2F86418077F0 en
# tant qu'élément identifyingNumber.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] 26A24AE4-039D-4CA4-87B4-2F86418077F0 analysé en tant qu'élé
#ment {26A24AE4-039D-4CA4-87B4-2F86418077F0}.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Début de configuration du package
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Démarrage en cours de C:\WINDOWS\system32\msiexec.exe avec
#/i "C:\jre1.8.0_77_x64.msi" /quiet.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Démarrage du processus C:\WINDOWS\system32\msiexec.exe avec
# les arguments /i "C:\jre1.8.0_77_x64.msi" /quiet
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] L’ordinateur requiert un redémarrage.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Le package a été installé.
#COMMENTAIRES : [FLOSTATION]:                            [[Package]Java] Configuration du package terminée

Pour ceux qui ont déjà réalisé de l’installation de logiciels notamment par GPO pour gérer le cycle de vie de vos applications, vous savez que l’installation de logiciels via les packages MSI ou EXE n’est pas toujours simple et les résultats ne sont pas toujours concluants. Il faudra tester sur un nœud avant d’envisager un déploiement de masse, car d’un logiciel à un autre, les changements peuvent être nombreux notamment au niveau des commutateurs d’installation.

Je souhaitais tout de même réveiller votre curiosité et vous montrer cette facette de PowerShell DSC, puisqu’une fois que cette méthode sera rodée pour certains logiciels aux mises à jour récurrente, vous pourrez apprécier.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail