Ansible sur les hôtes Windows
Enregistrement vidéo du cours: Lien vers la vidéo
Manipulation 1: Préparation de l'environnement
1. Préparation de l'environnement
Pour les manipulations suivantes, vous aurez besoin de :
- Une machine Windows (physique ou virtuelle) configurée pour accepter les connexions WinRM. Vous pouvez utiliser le TODO fourni.
- Une machine Linux avec Ansible installé (votre machine de contrôle). Vous pouvez utiliser le même environnement que pour les manipulations précédentes:
2. Préparation de la machine Windows
Avant de pouvoir gérer une machine Windows avec Ansible, vous devez configurer WinRM (Windows Remote Management) sur cette machine. Pour ce faire, suivez les étapes ci-dessous :
- Ouvrez PowerShell en tant qu'administrateur sur la machine Windows.
- Exécutez la commande suivante pour activer l'accès à distance de PowerShell, comme nous avons vu dans les cours précédents :
Enable-PSRemoting -Force - Ouvrez le port 5985 (port HTTP) pour tous les profils de pare-feu :
$firewallParams = @{
Action = 'Allow'
Description = 'Inbound rule for Windows Remote Management via WS-Management. [TCP 5985]'
Direction = 'Inbound'
DisplayName = 'Windows Remote Management (HTTP-In)'
LocalPort = 5985
Profile = 'Any'
Protocol = 'TCP'
}
New-NetFirewallRule @firewallParams
Note: Pour des raisons de sécurité, il est recommandé d'utiliser HTTPS (port 5986) en production. Vous pouvez configurer WinRM pour utiliser HTTPS en suivant les instructions officielles de Microsoft. Pour les besoins de ces manipulations, nous utiliserons HTTP.
- Modifiez l'autorisation d'accès distant pour permettre l'authentification de base (Basic Authentication) :
Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value $true
Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true
- Vérifiez que WinRM est en cours d'exécution :
winrm get winrm/config/service
Le .ova fourni a déjà un utilisateur ansible avec le mot de passe Ansible123!. Vous pouvez utiliser ces informations pour vous connecter depuis Ansible, puisqu'il dispose des droits administratifs nécessaires.
3. Installatation du module Python pour WinRM
Sur votre machine de contrôle Ansible (Linux), vous devez installer le module Python pywinrm pour permettre à Ansible de communiquer avec les hôtes Windows via WinRM. Ce paquet n'est pas installé par défaut avec Ansible, et doit être installé via pip.
Commencez par créer un dossier pour votre projet Ansible, puis naviguez dans ce dossier :
mkdir ansible-windows
cd ansible-windows
Ensuite, activez votre environnement virtuel et installez pywinrm :
python3 -m venv venv # Crée un environnement virtuel nommé venv
source venv/bin/activate # Active l'environnement virtuel
# Votre terminal devrait maintenant ressembler à : (venv) ansible@ansible-controller:~/ansible-windows$
pip install ansible # Installe Ansible dans l'environnement virtuel
pip install pywinrm # Installe le module pywinrm
Note: Si vous n'êtes pas familier avec les environnements virtuels Python, ils permettent d'isoler les dépendances de votre projet des autres projets Python sur votre machine. Il est recommandé de toujours utiliser un environnement virtuel pour vos projets Python lorsqu'il s'agit d'installer des paquets supplémentaires.
4. Configuration de l'inventaire Ansible
Créez un projet Ansible pour gérer votre hôte Windows. Dans ce projet, créez un fichier d'inventaire inventory.ini avec le contenu suivant :
[windows_hosts]
win-server ansible_host=VOTRE_ADRESSE_IP_WINDOWS
[windows_hosts:vars]
# Type de connexion pour Windows
ansible_connection=winrm
# Port WinRM (5985 pour HTTP, 5986 pour HTTPS)
ansible_port=5985
# Utilisateur et mot de passe Windows
ansible_user=ansible
ansible_password=Ansible123!
# Transport WinRM (basic, ntlm, kerberos, credssp)
ansible_winrm_transport=basic
# Validation du certificat SSL (false pour certificat auto-signé en test)
ansible_winrm_server_cert_validation=ignore
Note: pour le futur, ne jamais mettre de mots de passe en clair dans l'inventaire en production. Utilisez ansible-vault pour chiffrer les credentials. Le concept de ansible-vault va au-delà des notions vues dans ce cours, mais vous pouvez consulter la documentation officielle pour plus d'informations.
5. Test de la connexion
Pour tester la connexion à votre hôte Windows, exécutez la commande suivante depuis votre machine de contrôle Ansible :
ansible -i inventory.ini windows_hosts -m win_ping
Le résultat attendu devrait ressembler à ceci :
win-server | SUCCESS => {
"changed": false,
"ping": "pong"
}
Le module win_ping est l'équivalent Windows du module ping. Il vérifie que la connexion WinRM fonctionne et qu'Ansible peut exécuter des commandes sur l'hôte Windows. Vous remarquerez que la syntaxe des modules Ansible pour Windows commence par win_, comme win_command, win_copy, etc.
Créez maintenant un fichier ansible.cfg dans le répertoire de votre projet Ansible avec le contenu suivant pour définir le fichier d'inventaire par défaut :
[defaults]
inventory = inventory.ini
Refaites le test de connexion sans spécifier l'inventaire :
ansible windows_hosts -m win_ping
Mainpulation 2: Gestion des services Windows
Nous avons maintenant configuré notre environnement pour gérer une machine Windows avec Ansible. Nous allons maintenant effectuer quelques manipulations de base pour gérer les services Windows.
Créez un fichier de playbook Ansible nommé windows_services.yml avec le contenu suivant :
---
- name: Gestion des services Windows
hosts: windows_hosts
gather_facts: yes
tasks:
# Vérifier l'état d'un service
- name: Obtenir l'état du service Windows Update
win_service:
name: wuauserv
register: service_info
- name: Afficher l'état du service
debug:
msg: "Le service Windows Update est {{ service_info.state }}"
# Démarrer un service s'il est arrêté
- name: S'assurer que le service Windows Time est démarré
win_service:
name: W32Time
state: started
start_mode: auto
Explications:
- Le playbook ressemble beaucoup à ceux que nous avons vus pour Linux, mais utilise des modules spécifiques à Windows.
- Le module
win_serviceest utilisé pour gérer les services Windows. Nous vérifions l'état d'un service, démarrons un service s'il est arrêté, et redémarrons un service. Pour exécuter le playbook, utilisez la commande suivante :
ansible-playbook windows_services.yml
Manipulation 3: Exécution de scripts PowerShell
Ansible permet également d'exécuter des scripts PowerShell sur des hôtes Windows. Créez un fichier de playbook nommé windows_powershell.yml avec le contenu suivant :
---
- name: Exécution de scripts PowerShell
hosts: windows_hosts
gather_facts: yes
tasks:
# Exécuter une commande PowerShell simple
- name: Obtenir la liste des processus gourmands en CPU
win_shell: |
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 |
Format-Table Name, CPU, WorkingSet -AutoSize
register: top_processes
- name: Afficher les résultats
debug:
var: top_processes.stdout_lines
# Créer et exécuter un script plus complexe
- name: "Espace disque avec objets"
ansible.windows.win_powershell:
script: |
Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -ne $null } |
ForEach-Object {
$total = $_.Used + $_.Free
[PSCustomObject]@{
Drive = $_.Name
UsedGB = [math]::Round($_.Used / 1GB, 2)
FreeGB = [math]::Round($_.Free / 1GB, 2)
PercentFree = [math]::Round(($_.Free / $total) * 100, 2)
}
}
register: disk_info
- name: Alerter si espace disque < 20%
debug:
msg: "ALERTE: Disque {{ item.Drive }} - Seulement {{ item.PercentFree }}% libre!"
loop: "{{ disk_info.output }}"
when: item.PercentFree < 20
# Installer un logiciel via Chocolatey
- name: Installer Chocolatey si non présent
win_shell: |
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
args:
creates: C:\ProgramData\chocolatey\bin\choco.exe
- name: Installer Notepad++ via Chocolatey
win_chocolatey:
name: notepadplusplus
state: present
Explications:
- Le module
win_shellpermet d'exécuter des commandes PowerShell simples. - Le module
win_powershellest utilisé pour exécuter des scripts PowerShell plus complexes. C'est un module plus récent et permet une meilleure gestion des scripts PowerShell et la manipulation des objets PowerShell. Ici, nous utilisons des objets PowerShell pour obtenir des informations sur l'espace disque et alerter si l'espace libre est inférieur à 20%. Nous pouvons directement accéder aux propriétés des objets retournés avec la notation pointée (par exemple,item.PercentFree), ce qui est un des avantages d'utiliserwin_powershell. - Nous utilisons également le module
win_chocolateypour installer des logiciels via le gestionnaire de paquets Chocolatey.
Pour exécuter le playbook, utilisez la commande suivante :
ansible-playbook windows_powershell.yml
Manipulation 4: Gestion des utilisateurs Windows
Ansible permet de gérer les utilisateurs et groupes Windows. Créez un fichier de playbook nommé windows_users.yml avec le contenu suivant :
---
- name: Gestion des utilisateurs Windows
hosts: windows_hosts
gather_facts: yes
tasks:
# Créer un nouvel utilisateur local
- name: Créer un utilisateur local 'ansible_user'
win_user:
name: ansible_dev
password: "SafePasswordForWinRM123!"
state: present
groups:
- Users
# Modifier le mot de passe d'un utilisateur existant
- name: Modifier le mot de passe de l'utilisateur 'ansible_user'
win_user:
name: ansible_dev
password: "NewPassword456!"
state: present
# Supprimer un utilisateur local
- name: Supprimer l'utilisateur local 'old_user'
win_user:
name: old_user
state: absent