15/11/2024

LogicielsPowerShell

Comment déployer un logiciel avec Chocolatey ?

I. Présentation

On se retrouve aujourd'hui pour le troisième épisode de la série sur l'installation de logiciels sur les postes clients. Après avoir vu comment exploiter les GPO pour déployer des logiciels, aussi bien au format MSI qu'au format EXE, aujourd'hui je vais vous présenter un outil différent : Chocolatey.

Retrouvez les deux épisodes précédents :

Episode 1 - Comment déployer des logiciels au format MSI par GPO ?

Episode 2 - Comment déployer des logiciels au format EXE par GPO ?

Chocolatey est gestionnaire de paquets pour Windows qui n'est pas sans rappeler les équivalents sous Linux comme Aptitude sous Debian et Ubuntu, avec la fameuse commande "apt-get install". Sur le même principe, Chocolatey va permettre d'installer des logiciels sur vos machines à partir d'un dépôt. Par défaut, les dépôts communautaires de Chocolatey accessibles sur Internet.

Chocolatey est un outil gratuit et communautaire même s'il existe également des versions payantes (Pro, Architect et Business) qui permettent d'aller encore plus loin. Dans cet article, et pour commencer, on va utiliser la version gratuite. On l'utilisera pour déployer des logiciels en mode silencieux sur des postes clients.

Note : dans cet article, je vais utiliser un poste client Windows 10, mais il est compatible avec toutes les versions de Windows depuis Windows 7 et Windows Server 2003.

Microsoft a également lancé son propre gestionnaire de paquets, vous pouvez retrouver mon article à son sujet :

Découvrir WinGet sous Windows 10

II. Installer Chocolatey à distance sur les machines

A. Prérequis : WinRM

Pour utiliser la gestion à distance sur une machine Windows, il est nécessaire de configurer le service WinRM. Ce service nécessite d'être actif sur la machine cible et surtout il faut créer une exception dans le pare-feu de Windows pour autoriser les connexions WinRM à partir d'un ou plusieurs hôtes.

Pour éviter de me répéter, pour cette partie-là je vous oriente vers un tutoriel que j'ai écris à ce sujet il y a quelques années et qui fonctionne toujours aujourd'hui : Configurer WinRM par GPO.

winrmgpo0

C'est une étape indispensable pour réaliser des installations à distance à partir de la commande "Invoke-Command" de PowerShell.

B. Installer Chocolatey par script PowerShell

Commençons par installer Chocolatey sur nos machines, à distance, à l'aide de PowerShell. Pour déployer le gestionnaire de paquets en lui-même sur nos machines, on pourrait s'appuyer sur une GPO avec un script qui s'exécute au démarrage de la machine (comme nous avons vu dans l'épisode précédent). Pour varier les plaisirs, on va l'installer avec PowerShell et Invoke-Command.

Commençons par récupérer à partir de l'Active Directory, la liste des machines sur lesquelles installer Chocolatey. Ici, je récupère les ordinateurs à partir de l'OU racine "OU=PC,DC=it-connect,DC=local" :

$Computers = Get-ADComputer -Filter * -SearchBase "OU=PC,DC=it-connect,DC=local" | Select-Object -ExpandProperty Name

Néanmoins, on peut aussi créer une liste d'ordinateurs manuellement en créant un tableau comme ceci :

$Computers = @("PC-W10","PC-W10-2","PC-W10-3")

Ensuite, on va s'appuyer sur Invoke-Command pour établir une connexion sur chaque poste client dans le but d'effectuer l'installation de Chocolatey. Cette installation s'effectue à l'aide du script officiel disponible sur le site Chocolatey à l'adresse suivante si vous souhaitez vérifier son code au préalable : Choco Install PS1

Invoke-Command -ComputerName $Computers -ScriptBlock {
       Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
       choco feature enable -n allowGlobalConfirmation
}

La commande "choco feature enable -n allowGlobalConfirmation" permet d'activer l'approbation automatique des différentes installations, cela évite d'avoir la demande de confirmation à chaque fois.

chocolatey

Sur la machine "PC-W10", si j'ouvre une console et que j'exécute "choco.exe", on peut voir que le gestionnaire de paquets s'est bien installé ?

Chocolatey est prêt à l'emploi sur nos machines, voyons maintenant comment en tirer profit...

III. Déployer un logiciel à distance avec Chocolatey

A. La liste des paquets Chocolatey

La liste des paquets installables avec Chocolatey est disponible sur le site chocolatey.org à l'adresse ci-dessous. Il y a plus de 8 000 paquets uniques, disponibles dans les dépôts communautaires. Prenez l'habitude d'installer seulement les paquets avec un icône "vert" car il s'agit des paquets vérifiés.

⭐ Chocolatey - Packages

Par exemple, Notepad++ est disponible et nous l'utiliserons en guise de cobaye. Il est intéressant de voir également que la commande d'installation est directement fournie, ici :

choco install notepadplusplus.install

Concrètement, si vous exécutez cette commande sur une machine où Chocolatey est installé, le logiciel va s'installer.

Une autre manière de rechercher un paquet est d'installer le client Chocolatey GUI sur une machine et de parcourir la liste des paquets. Il s'installe avec cette commande :

choco install chocolateygui

Lorsque l'on accède aux détails d'un paquet, on obtient la description mais aussi l'identifiant du paquet (sur la gauche) : ce qui donne le nom à utiliser avec "choco install".

Sur une machine où Chocolatey GUI est présent, il sert à installer des logiciels directement en local.

B. Le couple gagnant : Invoke-Command et choco install

A l'aide d'un simple script PowerShell, on va pouvoir installer un logiciel à distance avec Chocolatey sur un ensemble de machines. Nous allons réutiliser notre variable $Computers qui contient une liste de machines obtenue directement à partir de l'Active Directory.

$Computers = Get-ADComputer -Filter * -SearchBase "OU=PC,DC=it-connect,DC=local" | Select-Object -ExpandProperty Name

Ensuite, on va définir un bloc de code à exécuter sur chaque machine. Cela commence par la commande "choco install" suivie du nom du paquet, en l'occurrence ici "notepadplusplus.install" pour Notepad++. Un fichier de log sera généré à l'emplacement suivant : C:\Temp\choco.txt

Invoke-Command -ComputerName $Computers -ScriptBlock {

   choco install notepadplusplus.install | Out-File -FilePath C:\Temp\choco.txt

   if ($?) {
      Write-Output "$Env:COMPUTERNAME : Succès"
   }
   else {
      Write-Output "$Env:COMPUTERNAME : Echec"
   }
}

Le test "$?" de la condition "if" est un moyen de récupérer la présence d'une erreur, et donc de détecter un problème lors de l'installation.

Il ne reste plus qu'à enregistrer le script et à l'exécuter. Un retour sera effectué dans la console pour indiquer, pour chaque machine, si l'installation a réussie ou pas.

Note : si la commande "choco feature enable -n allowGlobalConfirmation" n'est pas exécutée sur la machine cible, il faut approuver l'installation en ajoutant "-y" à la commande d'installation : choco install notepadplusplus.install -y

Voici un aperçu du fichier de log créé en local sur chaque poste client : intéressant pour le debug dans le cas où l'application ne s'installe pas, par exemple.

Note : sur chaque machine où Chocolatey est installé, le gestionnaire de paquets gère son propre fichier de log à l'emplacement suivant : "C:\ProgramData\chocolatey\logs\chocolatey.log".

C. Déployer plusieurs logiciels avec Chocolatey

Pour déployer plusieurs logiciels, on peut tout simplement dupliquer les lignes "choco install" (et le test pour vérifier que l'installation est OK) et modifier le nom du paquet à chaque fois. On peut également faire une boucle Foreach, ce qui est plus propre, ou alors on peut aussi utiliser une liste d'installation Chocolatey, ce qui est possible avec un script PowerShell et un fichier JSON.

Si l'on reprend notre script précédent, et qu'on le fait évoluer pour ajouter une liste de logiciels à installer plutôt qu'un seul logiciel, cela donne :

$Computers = Get-ADComputer -Filter * -SearchBase "OU=PC,DC=it-connect,DC=local" | Select-Object -ExpandProperty Name

Invoke-Command -ComputerName $Computers -ScriptBlock {

   $PackagesList = @("notepadplusplus.install","vlc","foxitreader")

   Foreach($Package in $PackagesList){

      choco install $Package -y | Out-File -FilePath C:\Temp\choco-$Package.txt

      if ($?) {
         Write-Output "$Env:COMPUTERNAME - $Package : Succès"
      }
      else {
         Write-Output "$Env:COMPUTERNAME - $Package : Echec"
     }
   }
}

La variable $PackagesList contient le nom des paquets à déployer. Ensuite, une boucle ForEach permet de réaliser l'installation pour chaque application. Un fichier de log différent sera généré pour chaque logiciel et la sortie ressemblera à ça :

PC-W10 - notepadplusplus.install : Succès
PC-W10 - vlc : Succès
PC-W10 - foxitreader : Succès

D. Cibler seulement les machines en ligne

Inutile de chercher à se connecter sur une machine hors ligne, c'est-à-dire déconnectée du réseau ou alors éteinte ! Avec le script tel qu'il est pour le moment, c'est un cas que l'on va probablement rencontrer et qui n'est pas géré.

A l'aide du cmdlet Test-Connection, on va pouvoir pinger chaque machine et déterminer s'il faut déclencher l'installation ou non. Il y a deux approches :

  • Tester chaque machine en amont et déclencher l'installation sur une liste affinée de machines en ligne
  • Tester et installer au fur et à mesure sur les machines qui sont en ligne

La deuxième approche me semble plus précise si l'on doit réaliser l'installation sur un nombre important de postes. Pour une raison simple : une machine en ligne maintenant ne le sera peut être pas dans 10 minutes. Du coup, le temps de créer la liste, il sera peut être trop tard pour certains postes, même si cela se discute car un ping par machine c'est très rapide.

La commande qui va permettre de tester rapidement si une machine est joignable ou non est la suivante :

Test-Connection -ComputerName <nom-machine> -Quiet -Count 1

Ce qui donnera lieu à une condition toute simple :

if(Test-Connection -ComputerName $computer -Quiet -count 1) { <code> }else{ <code> }

En complément, on va utiliser une boucle Foreach pour parcourir la liste d'ordinateurs. Dans la commande Invoke-Command, il faudra penser à utiliser aussi $Computer au lieu de $Computers, sinon pour chaque ordinateur on va traiter tous les ordinateurs dans le tour de boucle... Le script complet tenant compte de cette évolution est le suivant :

$Computers = Get-ADComputer -Filter * -SearchBase "OU=PC,DC=it-connect,DC=local" | Select-Object -ExpandProperty Name

Foreach($Computer in $Computers){

   if(Test-Connection -ComputerName $computer -Quiet -count 1) {

      Invoke-Command -ComputerName $Computer -ScriptBlock {

         $PackagesList = @("notepadplusplus.install","vlc","foxitreader")
         Foreach($Package in $PackagesList){

            choco install $Package -y | Out-File -FilePath C:\Temp\choco-$Package.txt

            if ($?) {
               Write-Output "$Env:COMPUTERNAME - $Package : Succès"
            }
            else {
               Write-Output "$Env:COMPUTERNAME - $Package : Echec"
            }
         }
      }
   }else{
      Write-Output "$Computer n'est pas en ligne !"
   }
}

Désormais, on traite un ordinateur seulement s'il est en ligne. Dans le cas où il est hors ligne/éteint, un message s'affiche dans la console : <nom ordinateur> n'est pas en ligne !

IV. Déployer un logiciel par GPO avec Chocolatey

Un simple script PowerShell avec une seule ligne peut permettre d'installer un logiciel avec Chocolatey. Pour le coup, il n'y a pas de raison que ce script ne soit pas utilisable par GPO : ce qui offre une alternative à l'installation à distance où il faut que la machine soit allumée au moment où l'on déclenche l'installation.

Pour installer VLC Media Player, la commande ci-dessous suffit :

choco install vlc | Out-File -FilePath C:\Temp\choco.txt

Le fichier de log est facultatif, on pourrait tout simplement indiquer :

choco install vlc

Ensuite, il faut créer une nouvelle GPO qui va exécuter un script de démarrage et ajouter notre script PowerShell : nous avons déjà vu comment faire à l'occasion de l'épisode 2 pour exécuter un script qui installe un logiciel au format EXE. Le principe est le même, c'est seulement le contenu du script qui change.

Si l'on exécute plusieurs fois la même commande d'installation, Chocolatey ne perd pas de temps : il voit que le logiciel est déjà installé. Le fichier de log va contenir la ligne suivante :

vlc v3.0.12 already installed.

V. Chocolatey - Installer une version spécifique et gérer les mises à jour

Pour installer une application dans une version spécifique, et sous réserve que cette version soit disponible dans les dépôts de Chocolatey, il faut spécifier un paramètre supplémentaire lors de l'utilisation de "choco install" : --version. Par exemple, pour installer la version 7.8.9 de Notepad++ on utilisera cette commande :

 choco install notepadplusplus --version 7.8.9

Sur le site Chocolatey, lorsque l'on regarde le détail d'un package, on peut voir l'historique des versions : une bonne façon de connaître les versions disponibles.

Ensuite, pour gérer les mises à jour des paquets, il y a deux façons : mettre à jour tous les paquets ou mettre à jour un ou plusieurs paquets spécifiques.

La commande suivante permet de mettre à jour tous les paquets :

choco upgrade all

Par "tous les paquets", j'entends tous les paquets installés via Chocolatey sur la machine cible. Ensuite, on peut mettre à jour seulement un paquet spécifique :

choco upgrade <nom-paquet>

En fait, le script que l'on utilise depuis le début peut être réutilisé et adapté pour gérer les mises à jour. On commencera par remplacer "choco install" par "choco upgrade".

VI. Quelques commandes utiles pour Chocolatey

Pour finir cet article, je vous propose quelques commandes supplémentaires à connaître pour manipuler Chocolatey, même si elles sont très nombreuses. Je vous mettrai ci-dessous le lien vers l'aide globale des commandes.

Chocolatey est capable de désinstaller un paquet qu'il a installé sur une machine. Voici, par exemple, comment désinstaller Notepad++ :

choco uninstall notepadplusplus -y

Pour lister les paquets installés avec Chocolatey sur une machine, on va utiliser "choco list" avec les options -local et -r, la seconde permettant d'obtenir une vue très synthétique avec les noms et les versions.

choco list -local -r

choco list

Avant de déclencher une mise à jour des paquets sur une machine, vous pourriez avoir envie de savoir quels sont les paquets à mettre à jour ? La commande ci-dessous affiche les paquets Chocolatey qui nécessitent une mise à jour.

choco outdated

choco outdated

En complément des outils de recherche que nous avons vu, on peut rechercher un paquet directement en ligne de commandes. Par exemple, pour rechercher tous les paquets avec le terme "vlc" dans le nom :

choco search vlc

choco search

Pour finir, voici le lien vers l'aide de toutes les commandes Chocolatey :

Chocolatey - Commandes

Comme nous venons le voir, Chocolatey est un outil très intéressant et puissant, même dans sa version gratuite ! Nous n'avons pas vu toutes les possibilités dans cet article : d'autres articles sur Chocolatey suivront pour aller plus loin avec cet outil.

➡ Vous pouvez comparer les éditions de Chocolatey sur cette page : Chocolatey - Editions

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

12 commentaires sur “Comment déployer un logiciel avec Chocolatey ?

  • Merci pour le taf et partage! Il me semblait que pour les organisations on devait forcément payer pour obtenir une licence, non? Je compte le déployer pour un parc d’environ 300 machines, j’aimerais bien utiliser ta méthode si juridiquement je suis dans les régles.

    Répondre
  • Bonjour,

    Justement hier j’ai testé PowerShell PackageManagement (OneGet) on parle aussi de PowerShellGet.
    J’ai encore un peu de mal avec tous les noms qui bougent chez MS 🙂

    Il y a un moyen d’utiliser la librairie de Choco directement dans PowerShell
    1) on ajoute le choco a PowerShell PackageManagement
    Get-PackageProvider Chocolatey
    2) si on recherche VLC
    Find-Package vlc
    3) exemple pour installé VLC
    Install-Package vlc
    Simple et Rapide 🙂

    Sources :
    La vidéo date de 2015 mais OneGet c’est PackageManagement (ou PowerShellGet) maintenant.
    https://www.youtube.com/watch?v=TvsWcW6njPw&t=445s
    https://www.tenforums.com/tutorials/2742-powershell-packagemanagement-oneget-install-apps-command-line.html
    https://arminreiter.com/2016/11/powershell-package-management-nuget-chocolatey-co/

    Répondre
  • Bonjour, je me renseigne sur des outils de déploiement d’applications dans le cadre d’un projet scolaire.
    J’ai juste une question sur l’utilisation de chocolatey sur un parc informatique: le téléchargement du paquet à installer via chocolatey se lance sur chaque poste ? Concrètement, il faut télécharger l’application autant de fois qu’on a de postes dans le parc ? Y’a-t-il une solution pour ne télécharger qu’un fois le paquet, et le déployer ensuite sur les postes ? Je pense à un Proxy cache par exemple, mais pas certain d’en connaitre le fonctionnement…

    Répondre
    • Hello 🙂
      Oui il faut télécharger l’application autant de fois qu’il y a de postes dans le parc. Par contre, c’est possible de créer un dépôt local (plusieurs méthodes possibles) pour distribuer les paquets sur son réseau local (et éviter de surcharger la ligne internet).
      Bonne journée
      Florian

      Répondre
      • La mise en place d’un proxy cache par exemple ? Je suis preneur pour d’éventuelles pistes. Après l’idée d’avoir un dépôt qui clone le dépôt officiel, qui doit faire plusieurs Go de données n’est peut-être pas judicieuse en fait. Existe-t-il des solutions peut-être plus générique pour l’installation/déploiement d’applications relativement « simple » ? Globalement l’idée de créer un partage réseau qui stocke les paquets à installer qu’on déploie par GPO via un script PS est possible / efficace techniquement ?
        (note: je débute dans une formation de gestion en maintenance de SI :p)

        Répondre
        • Tu peux créer un dépôt local uniquement pour les paquets que tu utilises, il n’est pas nécessaire de dupliquer tout le dépôt officiel. Rendez-vous mercredi prochain : un tutoriel sur la création d’un dépôt local Chocolatey sera publié sur le site 😉

          Répondre
  • Bonjour à toute l’équipe, j’espère que vous allez bien.
    Je vous explique mon soucis…
    Je suis dans une entreprise où je vais faire du déploiement et des mises à jour à distance. Je vais prendre l’exemple de TeamViewer parce que c’est celui qui me casse le plus les bonbons… Il y a déjà une version installée sur le poste distant et je souhaite donc faire une mise à jour en poussant une version supérieure via Chocolatey. Je suis dans une cas où je dois créer moi même les paquets en local pour ne pas à aller les chercher sur le repository de Chocolatey. Et donc en le faisant avec TeamViewer cela ne fonctionne pas, ça commence à lancer l’installation puis une fois arrivé au message « Installing teamviewer… » ça fige. Je pense qu’il faut modifier quelque chose dans le fichier d’installation .ps1 mais je sais pas quoi…

    Quelqu’un pourrait-il m’aider à ce sujet, c’est assez important.

    Merci par avance, dans l’attente d’un retour
    J’espère à très vite…

    Répondre
    • Hello,
      Si tu exécutes la commande en local sur un PC, Chocolatey met bien à jour Teamviewer ? L’idée étant de voir si ça fonctionne en local, avant de passer sur la version automatisée.

      Répondre
      • Bonjour,
        Oui ça fonctionne en local, c’est juste au niveau du passage à distance qui bloque un peu…

        Répondre
      • Peut-être auriez-vous une solution pour résoudre ce problème ?

        Répondre
        • Bonjour,
          Je t’invite à venir nous parler de ce problème sur le serveur Discord IT-Connect (lien dans la barre en haut à droite), ce sera plus pratique que par le système de commentaires et plus adapté à de l’entraide.

          Répondre
  • Bonjour,

    Merci Florian pour ce tuto.

    J’essaie de procéder à l’installation de Chocolatey via GPO (contenant la création d’une tache planifiée qui exécute powershell, comme tu as déjà pu le montrer).
    Je rencontre un problème au niveau de la tache planifiée, qui doit très certainement venir de l’argument dans l’action, que j’ai renseigné de la sorte en fonction de ce que tu as présenté :

    Argument dans l’action qui lance powershell :
    -ExecutionPolicy Bypass -File « \\monserveur\SYSVOL\mondomaine\scripts\Install_Chocolatey.ps1 »

    Saurais tu dire ce qui fait que le script suivant n’est pas exécuté par la tache planifiée ?

    Script Install_Chocolatey.ps1 :
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
    iex ((New-Object System.Net.WebClient).DownloadString(‘https://community.chocolatey.org/install.ps1’))

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.