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.