Automatisation de la construction d’image AppStream – partie 2 : on aime Chocolatey

Temps de lecture : 3 minutes

Nous avons vu dans la partie 1 comment instancier un image builder et comment se connecter à distance à cette instance sans passer par l’interface utilisateur.

Dans ce second article, nous verrons comment nous (Laurent Mas et moi-même) avons automatisé l’installation des applications. Cela fait déjà plusieurs années que l’équipe Devoteam Revolve automatise le déploiement des workloads Microsoft sur AWS, et si vous avez suivi nos webinars sur l’automatisation Windows, vous avez certainement déjà entendu parler de Chocolatey.

Chocolatey est un gestionnaire de packages pour Windows, semblable à Yum ou Apt pour Linux OS. Chocolatey package les scripts d’installation dans un fichier .nupkg et gère le versioning. Notre implémentation habituelle repose sur un serveur NuGet (qui peut être une simple instance Windows EC2 sur un serveur IIS) pour stocker nos fichiers .nupkg, et un bucket Amazon S3 où nous stockons les sources de notre application.

L’implémentation du script d’installation standard pour une application dans un package Chocolatey se déroule comme suit :

  • Quand vous lancez la commande “choco install my_app”, Chocolatey fait appel au fichier nommé ChocolateyInstall.ps1 dans le fichier .nupkg
  • Le script ChocolateyInstall.ps1 contient la logique pour télécharger nos sources logicielles sur S3; nous utilisons un profil d’instance IAM pour obtenir les autorisations nécessaires.
  • Une fois téléchargé, le script décompresse le contenu et lance les tâches d’installations.

Revenons à notre image builder. Nous avons écrit plusieurs scripts et fonctions pour répondre à nos premiers besoins :

  • Configurer le firewall Windows pour WinRM + configuration basique de WinRM
  • Se connecter via une session WinRM et se reconnecter après le redémarrage
  • Redémarrer l’image builder et se reconnecter ensuite
  • Installer une application en utilisant Chocolatey et la publier avec l’assistant image AppStream

Voici notre boucle principale pour installer les applications depuis une liste donnée :

WriteLog "Installing chocolatey client software and configuring it to point to $nugetRepo" $LoggingFile 3 "full" "ChocolateyAutomation"
    $install_choco=execute_remote_script -ip_address $ip_address -creds $winrm_credz -scriptName chocolatey_install.ps1
    write-output $install_choco
 
    WriteLog "Rebooting instance...Please wait" $LoggingFile 6 "verbose" "ChocolateyAutomation"
    reboot_and_wait_for_winrm -ip_address $ip_address -creds $winrm_credz -retry_time $retry_time -max_retry $max_retry -reboot_wait $reboot_wait
 
    $all_app_install=""
 
    #install all packages
    Foreach($app in $apps) 
    {   
        $app_id=$stack.stack_definition.$app
        WriteLog "Installing packages: $app_id ..." $LoggingFile 3 "full" "ChocolateyAutomation"
        $app_args = "-bucket", "$app_bucket_name", "-key", "$all_app_info_key", "-application_id", "$app_id"
        $install_app=execute_remote_script -ip_address $ip_address -creds $winrm_credz -scriptName add_application.ps1 -argument $app_args
        write-output $install_app
        $all_app_install+=$install_app
    }

Notre script add_application.ps1 n’est pas très compliqué mais il gère des exceptions, qui sortent du sujet de cet article. En gros, voilà ce qu’il fait :

  • Lire les caractéristiques de l’application (package chocolatey, nome de l’application, icône..) dans un fichier CSV sur un bucket S3
  • Lancer l’installation du package Chocolatey
  • Publier l’application avec l’assistant image AppStream (voir AWS blog post)

Pour l’installation du package Chocolatey, nous avons gardé une option pour choisir la version du package à installer ; sinon, ce sera la version la plus récente qui sera utilisée :

Try {
            if($package_version){
                $installResult=cinst -y $package_name --version $package_version | out-string
            }else{
                $installResult=cinst -y $package_name | out-string
            }
            
            Write-output "$installResult`n"
        }
        Catch {
            Write-Output "ERROR Failed to install $package_name`n"
            Write-Output $_ | format-list * -force
        }

Tout cela combiné nous permet d’automatiser les actions suivantes :

  • Créer une nouvelle instance AppStream Image Builder
  • Se connecter à l’instance
  • Installer nos applications
  • Publier nos applications avec l’assistant image AppStream
  • Finaliser notre image et la publier dans le registre

Merci à Mathieu Dalbes pour les heures passées à tester et à débugger à nos côtés !

Références :

Commentaires :

A lire également sur le sujet :