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.