9 Exemple de Playbooks Ansible pour l’administration Windows

Photo of author

By pierre



Je vais vous présenter différentes actions qu’un administrateur peut exécuter sur un système Windows distant en utilisant Ansible Playbooks.

Ansible est un outil DevOps très répandu actuellement. Il propose un ensemble de modules dédiés à Windows, permettant de configurer et de gérer les serveurs Windows. Je pars du principe que Ansible est déjà installé sur le système Windows que vous utiliserez pour gérer les autres serveurs Windows.

Voici quelques exemples de tâches que les administrateurs Windows réalisent fréquemment. Vous constaterez avec quelle facilité Ansible peut être utilisé pour administrer Windows.

L’adresse IP de ma machine contrôleur Ansible sous Windows est 192.168.0.106, et celle de mon système Windows distant est 192.168.0.102. Avant de commencer, il est conseillé d’utiliser le module win_ping pour vérifier la connectivité avec le serveur distant.

[email protected] ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

La connexion à l’hôte distant a réussi.

Passons maintenant à l’utilisation d’Ansible Playbooks…

Transfert de fichiers

Le module Ansible win_copy permet de transférer un fichier du serveur local vers un hôte Windows distant. Je vais l’utiliser pour copier un fichier PDF.

Voici le code YAML à utiliser, en spécifiant les chemins source et destination.

[email protected] ~
$ vi copy.yml
---
- hosts: win
  tasks:
  - name: Copie de fichier
    win_copy:
      src: C:output.pdf
      dest: C:ansible_examples
      remote_src: yes

Exécutez Ansible Playbook pour réaliser la copie.

[email protected] ~
$ ansible-playbook copy.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Copie de fichier] *****************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Le fichier a été copié avec succès à l’emplacement indiqué sur le système Windows distant.

Installation et désinstallation d’applications MSI

Pour installer une application à partir d’un fichier MSI, vous devez d’abord utiliser win_get_url pour télécharger le fichier MSI, puis utiliser win_package pour l’installer. L’état « présent » indique que l’application doit être installée et que son état est conforme.

Dans cet exemple, je vais installer Apache.

Voici le code YAML à utiliser :

[email protected] ~
$ vi msi.yml
---
- name: Installation d'Apache MSI
  hosts: win
  tasks:
    - name: Télécharger l'installateur d'Apache
      win_get_url:
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
    - name: Installer MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        state: present

Exécutez Ansible Playbook pour réaliser l’installation.

[email protected] ~
$ ansible-playbook msi.yml
PLAY [Installation d'Apache MSI] *****************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Télécharger l'installateur d'Apache] *********************************************************************************************************
changed: [192.168.0.102]
TASK [Installer MSI] ***************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Vérifiez sur le système Windows distant que l’application Apache a été installée correctement.

C:Userstoptips.fr>cd C:Program Files (x86)Apache Software FoundationApache2.2bin
C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v
Server version: Apache/2.2.25 (Win32)
Server built: Jul 10 2013 01:52:12

Il est également possible d’installer des applications MSI en utilisant des arguments. Voici un exemple similaire au précédent, mais avec des arguments d’installation au lieu d’un état.

Voici le code YAML à utiliser :

---
- name: Installation d'Apache MSI
  hosts: win
  tasks:
    - name: Télécharger l'installateur d'Apache
      win_get_url:
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
    - name: Installer MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        arguments:
          - /install
          - /passive
          - /norestart

Pour désinstaller une application MSI, utilisez le module win_package avec l’état « absent ». Cela signifie que l’application sera supprimée en utilisant le fichier MSI.

Dans cet exemple, je désinstalle Apache.

[email protected] ~
$ vi uninstall_msi.yml
---
- name: Désinstallation d'Apache MSI
  hosts: win
  tasks:
    - name: Désinstaller MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        state: absent

Exécutez Ansible Playbook pour la désinstallation.

[email protected] ~
$ ansible-playbook uninstall_msi.yml
PLAY [Désinstallation d'Apache MSI] *****************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Désinstaller MSI] *************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Si vous tentez de vérifier la version d’Apache après la désinstallation, vous obtiendrez le message d’erreur ci-dessous.

C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v
'httpd' n'est pas reconnu comme une commande interne
ou externe, un programme exécutable ou un fichier de commandes.

Désinstallation de logiciels (.EXE)

Vous pouvez également désinstaller un logiciel à partir de son fichier .exe en utilisant son identifiant produit.

[email protected] ~
$ vi uninstall.yml
---
- hosts: win
  tasks:
   - name: Désinstaller 7-Zip à partir de l'exe
     win_package:
       path: C:Program Files7-ZipUninstall.exe
       product_id: 7-Zip
       arguments: /S
       state: absent

Exécutez Ansible Playbook pour désinstaller 7-Zip.

[email protected] ~
$ ansible-playbook uninstall.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Désinstaller 7-Zip à partir de l'exe] ***********************************************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Arrêt, démarrage et redémarrage de services Windows

Le module Ansible win_service sert à démarrer, arrêter ou redémarrer un service. Voici comment arrêter le service Tomcat.

Indiquez le nom du service dans le fichier YAML et définissez l’état sur « stopped ».

[email protected] ~
$ vi service.yml
---
- hosts: win
  tasks:
   - name: Arrêter le service Tomcat
     win_service:
       name: Tomcat8
       state: stopped

Exécutez Ansible Playbook pour arrêter le service Tomcat.

[email protected] ~
$ ansible-playbook service.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Arrêter le service Tomcat] ****************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Si vous vérifiez le service Tomcat sur le système Windows, son état est maintenant « arrêté ».

Vous pouvez définir l’état sur « started », « restarted » ou « paused » pour modifier l’état du service.

Collecte d’informations (faits)

En utilisant le module Ansible win_disk_facts, vous pouvez récupérer toutes les informations relatives aux disques de l’hôte cible.

[email protected] ~
$ vi disk.yml
---
- hosts: win
  tasks:
  - name: Obtenir les informations sur les disques
    win_disk_facts:
  - name: Afficher la taille du premier disque
    debug:
      var: ansible_facts.disks[0].size
  - name: Convertir la taille du premier disque système en différents formats
    debug:
      msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
    vars:
      # Obtenir le premier disque système
      disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'
      # Afficher la taille du disque en Gibibytes
      disksize_gib_human: '{{ disk.size|filesizeformat(true) }}'
      disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'

Exécutez Ansible Playbook pour obtenir les informations sur les disques.

[email protected] ~
$ ansible-playbook disk.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Obtenir les informations sur les disques] ************************************************************************************************************************
ok: [192.168.0.102]
TASK [Afficher la taille du premier disque] ****************************************************************************************************************
ok: [192.168.0.102] => {
"ansible_facts.disks[0].size": "1000204886016"
}
TASK [Convertir la taille du premier disque système en différents formats] ****************************************************************************************
ok: [192.168.0.102] => {
"msg": "932 GiB vs 931.5 GiB"
}
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=4 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

En utilisant le module Ansible win_command, vous pouvez exécuter des commandes sur l’hôte distant et obtenir des informations sur le processeur, les périphériques, etc.

wdzwd[email protected] ~
$ vi check.yml
---
- hosts: win
  tasks:
   - name: Obtenir les informations sur les disques
     win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
     register: usage
   - debug: msg="{{ usage.stdout }}"

Exécutez Ansible Playbook pour obtenir les informations système du serveur distant.

[email protected] ~
$ ansible-playbook check.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Obtenir les informations] ************************************************************************************************************************
changed: [192.168.0.102]
TASK [debug] *********************************************************************************************************************************
ok: [192.168.0.102] => {
"msg": "Caption DeviceID MaxClockSpeed
Name
NumberOfCores Status rrnIntel64 Family 6 Model 142 Stepping 9 CPU0 2712 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2 OK rrnrrn"
}
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=1 unreachable=0 failed=0
skipped=0 rescued=0
ignored=0

Exécution de commandes

Toutes les commandes que vous exécutez habituellement sur une machine Windows peuvent être exécutées via le module Ansible win_command. Il suffit de spécifier la commande dans votre fichier YAML. Ici, je crée un répertoire.

[email protected] ~
$ vi commands.yml
---
- hosts: win
  tasks:
   - name: Exécuter un exécutable en utilisant win_command
     win_command: whoami.exe
   - name: Exécuter une commande cmd
      win_command: cmd.exe /c mkdir C:test

Exécutez Ansible Playbook pour réaliser l’opération.

[email protected] ~
$ ansible-playbook commands.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Exécuter un exécutable en utilisant win_command] ***************************************************************************************************
changed: [192.168.0.102]
TASK [Exécuter une commande cmd] *********************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Variables d’environnement

Un système Windows possède plusieurs variables d’environnement, telles que JAVA_HOME. En utilisant le module Ansible win_environment, vous pouvez ajouter ou modifier des variables d’environnement sur un système Windows. Dans cet exemple, j’ajoute une nouvelle variable à la liste des variables d’environnement Windows.

[email protected] ~
$ vi env.yml
---
- hosts: win
  tasks:
   - name: Définir une variable d'environnement pour tous les utilisateurs
     win_environment:
       state: present
       name: NewVariable
       value: New Value
       level: machine

Exécutez Ansible Playbook pour ajouter la variable d’environnement sur la machine Windows distante.

[email protected] ~
$ ansible-playbook env.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Définir une variable d'environnement pour tous les utilisateurs] *********************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Consultez la fenêtre des variables d’environnement ; vous verrez que la nouvelle variable que vous venez d’ajouter est présente.

Ajout et modification du registre

Le module Ansible win_regedit sert à ajouter ou à modifier les entrées du registre sur une machine Windows distante. Il faut spécifier le chemin du registre et le contenu à ajouter ou à mettre à jour. Ici, je crée une nouvelle entrée de registre « toptips.fr » dans le chemin HKLM:SOFTWARE, puis j’ajoute un nom et des données à ce registre.

[email protected] ~
$ vi registry.yml
---
- hosts: win
  tasks:
   - name: Créer une entrée de registre
     win_regedit:
      path: HKLM:SOFTWAREtoptips.fr
   - name: Modifier une entrée de registre, ajout du nom et des données
     win_regedit:
      path: HKLM:SOFTWAREtoptips.fr
      name: Geek
      data: Flare

Exécutez Ansible Playbook pour ajouter l’entrée de registre.

[email protected] ~
$ ansible-playbook registry.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Créer une entrée de registre] *******************************************************************************************************************
changed: [192.168.0.102]
TASK [Modifier une entrée de registre, ajout du nom et des données] ********************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Ouvrez l’Éditeur du Registre sur le système distant, vous constaterez que l’entrée a été ajoutée correctement avec le nom et les données indiquées.

Suppression des journaux

Le module Ansible win_eventlog sert à ajouter, effacer ou supprimer les journaux d’événements Windows du système.

Ouvrez Windows Powershell et listez les journaux d’événements présents sur la machine Windows distante.

PS C:Userstoptips.fr> Get-EventLog -List
  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded      33,549 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder             20 Internet Explorer
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     128      0 OverwriteAsNeeded         190 OAlerts
                                              Security
  20,480      0 OverwriteAsNeeded      44,828 System
  15,360      0 OverwriteAsNeeded       3,662 Windows PowerShell

Je vais vous montrer comment supprimer les journaux de toutes les sources pour Internet Explorer.

[email protected] ~
$ vi log.yml
---
- hosts: win
  tasks:
   - name: Supprimer les journaux d'Internet Explorer
     win_eventlog:
      name: Internet Explorer
      state: absent

Exécutez Ansible Playbook pour supprimer les journaux d’Internet Explorer de la machine Windows distante.

[email protected] ~
$ ansible-playbook log.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Supprimer les journaux d'Internet Explorer] **********************************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Si vous listez à nouveau les EventLogs, vous constaterez que les journaux d’Internet Explorer ont été supprimés.

PS C:Userstoptips.fr> Get-EventLog -List
  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded      33,549 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     128      0 OverwriteAsNeeded         190 OAlerts
                                              Security
  20,480      0 OverwriteAsNeeded      44,835 System
  15,360      0 OverwriteAsNeeded          56 Windows PowerShell

Voici donc quelques exemples de Playbooks Ansible pouvant être utilisés pour l’administration distante de systèmes Windows. N’hésitez pas à les tester. Vous pouvez également explorer d’autres modules Ansible pour Windows.