Orchestrez vos traitements avec un workflow PowerShell

Windows PowerShell Workflow est une nouvelle fonctionnalité de Windows PowerShell 3.0 qui plaira particulièrement aux administrateurs qui ont besoin d'exécuter des traitements multi-serveurs impliquant des tâches qui prennent du temps, parfois en séquence ou en parallèle, et supportant les redémarrages et les déconnexions. La fonctionnalité s'appuie sur Windows Workflow Foundation, et permet de définir des workflows en PowerShell en plus du XAML.

J'ai eu l'occasion de démontrer un workflow simple lors de l'événement de lancement de Windows Server 2012 le 24 octobre 2012, que je vais détailler un peu dans ces quelques lignes.

Le principe de ce workflow est le suivant : on souhaite déployer un site web sur une ferme de plusieurs serveurs qui ont déjà Windows Server 2012 et sont déjà membres d'un domaine. Sur chacun de ces serveurs, le workflow devra effectuer les opérations suivantes :

  • Installer les prérequis : IIS et éventuellement quelques composants supplémentaires tels que ASP.NET 4.5, les outils d'administration d'IIS et NLB. En fonction du site web il peut être nécessaire d'installer une base de données locale comme SQL Server Compact Edition et ASP.NET MVC.
  • Redémarrer le serveur : cela peut être nécessaire en fonction des composants installés. Pour l'exemple et illustrer la puissance des workflows, nous allons redémarrer les serveurs après l'installation des prérequis.
  • Copier les fichiers du site web.
  • Eventuellement, procéder à d'autres configurations complémentaires, comme par exemple placer les permissions adéquates sur des fichiers de base de données.

Voici le code du workflow en question (fichier : demoinstallwebsite1.psm1)

 # Définition du workflow

workflow Install-WebSite
{
    # Activité : installation des prérequis

    workflow Install-Prerequisites
    {
        # Installe IIS et ASP.NET
        Install-WindowsFeature `
            -Name Web-Server, Web-Asp-Net45, Web-Mgmt-Tools
    }

    # Activité : copie des fichiers du site web

    workflow Copy-WebContent
    {
        Remove-Item -Path c:\inetpub\wwwroot\* -Recurse
        Copy-Item -Path \\srv1\demo\website\wwwroot\* `
            -Destination c:\inetpub\wwwroot -Recurse
    }

    # Corps du déploiement

    $computers = Get-PSWorkflowData[String[]] `
        -VariableToRetrieve PSComputerName
    foreach -parallel($computer in $computers)
    {
        Install-Prerequisites
        Restart-Computer -Wait -For PowerShell -Force
        Checkpoint-Workflow
        Copy-WebContent
    }
} 

Le mot-clé workflow est utilisé pour le workflow global (Install-WebSite) mais aussi pour chacune des activités définies à l'intérieur. Cela garantit une exécution par le moteur de workflow de Windows, et donc la capacité d'exécuter les activités sur les différents serveurs.

La dernière partie exécute le script de déploiement en parallèle sur les plusieurs machines dont les noms sont passés en paramètre du workflow, grâce à l'instruction foreach -parallel. La commande Restart-Computer redémarre une machine, puis attend que la connectivité PowerShell soit à nouveau disponible. Remarquez également la commande Checkpoint-Workflow, qui sauvegarde l'état du workflow sur le disque au cas où un problème survienne.

Pour exécuter ce workflow de démonstration, j'ai préparé les éléments suivants (toutes les machines sont des VM hyper-V exécutant Windows Server 2012 Datacenter en-us, sauf mention contraire) :

  • Un domaine AD nommé w2k12-demo.net, avec un contrôleur de domaine (dc) et un serveur membre (srv1).
  • Un compte administrateur du domaine, dans mon cas le compte s'appelle w2k12-demo\admin.
  • Deux serveurs membres (web1 et web2) dans le même domaine, chacun avec un snapshot permettant de recommencer le test depuis l'état initial (sans rôle ni fonctionnalité installés).
  • Sur le serveur srv1 : le script demoinstallwebsite1.psm1 ci-dessus et un fichier texte demomachinelist.txt contenant, sur deux ligne, les noms (fqdn) des deux serveurs web1 et web2.
  • Les fichiers du site web à installer sont dans un partage sur le serveur srv1 : \\srv1\demo\website\wwwroot.
  • L'authentification CredSSP est configurée pour WinRM sur les serveurs srv1, web1 et web2 par une GPO :
    • Computer Configuration/Administrative Templates/Windows Components/Windows Remote Management (WinRM)/WinRM Client : Allow CredSSP authentication  = Enabled
    • Computer Configuration/Administrative Templates/Windows Components/Windows Remote Management (WinRM)/WinRM Service : Allow CredSSP authentication  = Enabled

Pour exécuter le workflow, ouvrir sur srv1 une fenêtre PowerShell et exécuter les commandes suivantes.

  1. Charger le module (fichier .psm1) :

    Import-Module .\demoinstallwebsite1.psm1

  2. Charger la liste des serveurs cibles dans une variable $machines :

    $machines = Get-Content demomachinelist.txt

         
    Si tout se passe bien nous devons voir ceci :

    image

    On peut vérifier que tout s'est bien passé en tapant Get-Command -Module demoinstallwebsite1 pour afficher les commandes du module, et en tapant $machines pour vérifier la liste des machines cibles.

  3. Exécuter le workflow :

    Install-WebSite -PSComputerName $machines -PSAuthentication Credssp -PSCredential w2k12-demo\admin

Cette dernière commande provoque l'exécution synchrone du workflow. Si l'on souhaite une exécution asynchrone, il faut regarder du côté des sessions déconnectées, qui feront peut-être l'objet d'un prochain article.

L'authentification CredSSP est spécifiée dans la commande, ce qui provoque la saisie du mot de passe du compte utilisé :

image

 

Avec cette méthode synchrone, l'intérêt est que nous pouvons suivre l'exécution du workflow par dessus la fenêtre PowerShell.

image

Sur la capture ci-dessus, nous voyons par exemple que web1 et web2 sont tous les deux en train de redémarrer.

La fin de la démo consiste à ouvrir les sites https://web1 et https://web2 pour vérifier que tout s'est bien déroulé.

Cet exemple ne donne qu'une petite idée des possibilités offertes par les workflows, je vous encourage donc à approfondir le sujet en parcourant les pages suivantes :

Et n'oubliez pas, téléchargez la version d'évaluation de Windows Server 2012 ici : https://aka.ms/jeveuxwindows2012. Une surprise vous y attend pour une période limitée.