Aller au contenu
Infrastructure as Code medium

Ansible Windows : WinRM vs OpenSSH

16 min de lecture

logo

Contrairement aux idées reçues, Ansible ne se limite pas aux systèmes Linux. Il est tout à fait capable de gérer des machines Windows, à condition de bien configurer les connexions. Deux méthodes sont principalement utilisées : WinRM, historiquement supportée, et OpenSSH, de plus en plus populaire pour sa simplicité. Ce guide vous accompagne dans la mise en place de ces deux approches pour automatiser efficacement vos tâches sur Windows.

Pour gérer des hôtes Windows avec Ansible, certaines conditions doivent être réunies, tant côté système que du côté d’Ansible.

Ansible prend en charge les versions récentes de Windows, notamment :

  • Windows Server 2016, 2019, 2022
  • Windows 10 et Windows 11

Veillez à toujours maintenir vos systèmes à jour pour garantir une compatibilité optimale avec les modules Ansible.

Assurez-vous que les hôtes Windows disposent de :

  • PowerShell 5.1 ou supérieur
  • .NET Framework 4.0 ou supérieur

Ces composants sont nécessaires pour exécuter les commandes envoyées par Ansible, surtout via WinRM.

Collections nécessaires côté Ansible Installez les collections suivantes :

Fenêtre de terminal
ansible-galaxy collection install ansible.windows
ansible-galaxy collection install community.windows

Ces collections fournissent tous les modules spécifiques à Windows (win_service, win_package, etc.).

Python côté contrôleur Ansible Sur le poste de contrôle (Linux), Ansible doit tourner avec au minimum une version récente de Python.

Une fois ces prérequis respectés, vous pouvez passer à la configuration des connexions selon le protocole choisi : WinRM ou OpenSSH.

WinRM (Windows Remote Management) est le protocole de gestion à distance intégré à Windows. Il permet d’exécuter des commandes PowerShell à distance et d’administrer des systèmes Windows via des API REST. WinRM est le choix traditionnel pour gérer des hôtes Windows avec Ansible, mais il nécessite une configuration plus complexe que OpenSSH.

1. Activation de WinRM sur la machine Windows

Ouvrez PowerShell en tant qu’administrateur et exécutez :

Fenêtre de terminal
Enable-PSRemoting -Force

Cela configure un écouteur HTTP sur le port 5985, active le service WinRM et modifie le pare-feu automatiquement.

2. Vérification des écouteurs

Pour afficher les écouteurs actifs :

Fenêtre de terminal
winrm enumerate winrm/config/Listener

3. Mise en place d’un écouteur HTTPS

HTTPS est recommandé en production. Créez un certificat auto-signé, puis :

Fenêtre de terminal
winrm quickconfig -transport:https

Ou via PowerShell :

Fenêtre de terminal
$selector_set = @{
Address = "*"
Transport = "HTTPS"
}
$value_set = @{
CertificateThumbprint = "VOTRE_THUMBPRINT"
}
New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set

4. Autorisations supplémentaires

Pour les comptes locaux :

Fenêtre de terminal
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "LocalAccountTokenFilterPolicy" -Value 1 -PropertyType DWORD -Force

Pour activer l’authentification Basic :

Fenêtre de terminal
Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true

Utilisez HTTPS avec l’authentification Basic, car les identifiants sont transmis en clair.

5. Ajustement de la mémoire (hotfix pour PowerShell 3.0)

Si vous utilisez PowerShell 3.0, appliquez ce correctif :

Fenêtre de terminal
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
$file = "$env:temp\Install-WMF3Hotfix.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file -Verbose

Ansible** peut exécuter des tâches sur des hôtes Windows à l’aide du PowerShell Remoting Protocol (PSRP), en passant par deux plugins de connexion : winrm et psrp. Ces deux plugins utilisent WinRM comme transport réseau (HTTP/HTTPS), mais diffèrent dans leur implémentation côté Ansible.

Ansible utilise des plugins de connexion pour établir la communication avec les hôtes distants. Pour Windows, les deux principaux plugins sont winrm et psrp. Le choix entre ces deux plugins dépend de vos besoins spécifiques et de votre environnement.

Le plugin winrm est utilisé par défaut avec la variable ansible_connection=winrm. Il repose sur la bibliothèque pywinrm et traduit les modules Ansible en commandes PowerShell envoyées via WinRM.

Installation :

Fenêtre de terminal
pip install pypsrp

Avantages :

  • Supporté de longue date
  • Compatibilité avec tous les modules ansible.windows
  • Fonctionne bien dans des environnements simples

Limites :

  • Gestion limitée des sessions PowerShell
  • Moins performant avec de longues sorties
  • Sensible aux délais d’attente (timeouts) et à la latence

Introduit plus récemment, le plugin psrp repose sur la bibliothèque pypsrp. Il utilise les sessions PowerShell de manière native, ce qui permet une exécution plus fiable et performante.

Installation :

Fenêtre de terminal
pip install pypsrp

Configuration typique :

[windows]
192.168.1.10
[windows:vars]
ansible_connection=psrp
ansible_user=Administrateur
ansible_password=MotDePasseSécurisé
ansible_psrp_protocol=https
ansible_psrp_port=5986
ansible_psrp_auth=negotiate
ansible_psrp_cert_validation=ignore

Avantages :

  • Exécution native dans PowerShell
  • Meilleure gestion des flux de sortie
  • Moins de timeouts et de bugs sur des connexions longues
  • Prise en charge de proxys et de configurations personnalisées

Limites :

  • Moins utilisé, donc moins documenté
  • Requiert pypsrp, non installé par défaut
BesoinRecommandé
Simplicité, compatibilité largewinrm
Performances, fiabilité, environnements complexespsrp
Sessions PowerShell personnaliséespsrp
Intégration avec modules ansible.windowsLes deux

Dans les environnements modernes, psrp est souvent plus robuste que winrm, surtout si vous utilisez HTTPS et avez besoin de gérer de nombreuses tâches consécutives.

Depuis les versions récentes de Windows 10/11 et Windows Server 2019+, OpenSSH est intégré en tant que fonctionnalité optionnelle. Cette méthode de connexion permet à Ansible d’accéder à Windows via SSH, comme il le ferait pour un hôte Linux. Elle est plus simple à configurer que WinRM et repose sur le protocole SSH standard.

1. Activer le composant OpenSSH Server

Dans PowerShell en tant qu’administrateur :

Fenêtre de terminal
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

2. Démarrer et activer le service SSHD

Fenêtre de terminal
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

3. Ouvrir le port 22 dans le pare-feu

Fenêtre de terminal
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Par défaut, SSH utilise cmd.exe. Pour que PowerShell soit utilisé comme shell distant :

Fenêtre de terminal
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

Redémarrez le service sshd après cette modification.

[windows]
192.168.1.10
[windows:vars]
ansible_connection=ssh
ansible_user=ansibleuser
ansible_password=MotDePasseSécurisé
ansible_shell_type=powershell
ansible_ssh_common_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'

Si vous utilisez l’authentification par clé SSH, installez la clé publique dans C:\Users\USERNAME\.ssh\authorized_keys.

  • Utilisez l’authentification par clé SSH pour éviter les mots de passe en clair.
  • Assurez-vous que le service SSHD est toujours actif et démarre automatiquement.
  • Sécurisez l’accès SSH via des ACLs ou sshd_config.
  • Vérifiez les logs en cas d’erreur dans C:\ProgramData\ssh\logs.
  • Certaines fonctionnalités avancées de PowerShell (comme la double authentification Kerberos) peuvent ne pas fonctionner via SSH.
  • Tous les modules Ansible Windows ne sont pas garantis compatibles avec SSH.

Plus d’infos sur Configuring Ansible for SSH on Windows

Ansible permet de se connecter à un hôte Windows via WinRM ou OpenSSH. Ces deux méthodes présentent des différences majeures en termes de configuration, de sécurité, de compatibilité et de maintenance.

CritèreWinRMOpenSSH
InstallationNatif sur WindowsOptionnel à activer
Configuration initialeComplexe (HTTPS, ACL, certificats)Simple (activation, pare-feu)
Port utilisé5985 (HTTP), 5986 (HTTPS)22 (SSH)
SécuritéNécessite HTTPS pour sécuriser Basic authChiffrement natif
AuthentificationBasic, NTLM, Kerberos, CredSSPMot de passe, clé SSH, GSSAPI
Shell par défautPowerShellcmd.exe (modifiable)
Transfert de fichiersLenteur connue avec win_copyRapide avec scp intégré
Support dans AnsibleDepuis toujoursStable depuis Ansible 2.14+
Compatibilité modules100% (modules win_*)Partielle, certains modules limités
Dépannage / logsPlus complexeSimplicité des logs sshd
Scénarios entrepriseIntégré à Active DirectoryMoins intégré aux environnements AD
  • En environnement d’entreprise avec des politiques Active Directory
  • Pour des tâches complexes utilisant des modules natifs Windows
  • Quand vous avez besoin d’un support complet des modules Ansible
  • Pour un projet rapide ou un lab local
  • Sur des systèmes Windows modernes (10/11, Server 2019+)
  • Si vous maîtrisez déjà SSH et souhaitez une configuration légère

Une fois la configuration terminée, testez la connexion à l’hôte Windows avec la commande suivante :

Fenêtre de terminal
ansible windows -i inventory.ini -m win_ping

Réponse attendue :

192.168.1.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Pour gérer efficacement des systèmes Windows avec Ansible, il est indispensable d’utiliser les collections de modules dédiées. Ces collections regroupent des modules, plugins et rôles conçus spécifiquement pour Windows, et permettent de bénéficier des dernières fonctionnalités et corrections.

Pour installer les collections nécessaires, utilisez la commande suivante :

Fenêtre de terminal
ansible-galaxy collection install ansible.windows community.windows

Cette commande télécharge et installe les collections ansible.windows et community.windows depuis le dépôt officiel d’Ansible Galaxy. Ces collections sont régulièrement mises à jour pour intégrer de nouveaux modules et corriger des bugs. Il est donc recommandé de les mettre à jour régulièrement avec la commande :

Fenêtre de terminal
ansible-galaxy collection install ansible.windows community.windows --force

Cette commande force la réinstallation des collections, même si elles sont déjà installées. Cela garantit que vous disposez de la dernière version des modules et plugins. Vous pouvez également spécifier une version particulière de la collection en ajoutant ==<version> à la fin de la commande. Par exemple :

Fenêtre de terminal
ansible-galaxy collection install ansible.windows==1.0.0

Vous pouvez aussi utiliser le fichier requirements.yml pour gérer les dépendances de vos projets Ansible. Voici un exemple de fichier requirements.yml pour installer les collections ansible.windows et community.windows :

---
collections:
- name: ansible.windows
version: "2.8.0"
- name: community.windows
version: "2.4.0"

Ensuite, exécutez la commande suivante pour installer les collections définies dans le fichier requirements.yml :

Fenêtre de terminal
ansible-galaxy collection install -r requirements.yml

Cette collection est la collection officielle d’Ansible pour la gestion des systèmes Windows. Elle est maintenue par l’équipe Ansible et est disponible sur Ansible Galaxy. Elle est conçue pour fonctionner avec les dernières versions de Windows et est régulièrement mise à jour pour intégrer de nouveaux modules et fonctionnalités.

La collection ansible.windows regroupe l’ensemble des modules et plugins dédiés à l’administration, la configuration et l’automatisation des environnements Windows avec Ansible. Elle couvre tous les besoins courants d’un administrateur système ou d’un ingénieur DevOps travaillant sur des serveurs ou postes de travail Windows : gestion des utilisateurs, des groupes, des services, des fichiers, du registre, des rôles Windows, des tâches planifiées, de la sécurité, etc.

Grâce à cette collection, il est possible de piloter des infrastructures Windows de la même manière que des systèmes Linux, en profitant de la puissance d’Ansible pour l’automatisation, l’orchestration et la conformité.

Pour vous repérer dans la collection, voici une cartographie des principaux domaines couverts, avec quelques modules emblématiques :

DomaineExemples de modulesPour quoi faire ?
Gestion des utilisateurswin_user, win_groupCréer, modifier ou supprimer des comptes et groupes locaux.
Gestion des fichierswin_copy, win_file, win_templateCopier, supprimer, déplacer ou gérer les permissions sur les fichiers et dossiers.
Services & processuswin_service, win_processDémarrer, arrêter, configurer ou surveiller des services et processus Windows.
Registre Windowswin_regedit, win_reg_stat, win_reg_mergeLire, écrire ou supprimer des clés et valeurs du registre.
Rôles & fonctionnalitéswin_feature, win_roleInstaller ou désinstaller des rôles et fonctionnalités Windows Server.
Tâches planifiéeswin_scheduled_taskCréer, modifier ou supprimer des tâches planifiées.
Sécurité & stratégiewin_firewall_rule, win_user_rightGérer les règles du pare-feu, les droits utilisateurs, les stratégies locales.
Réseauwin_dns_client, win_route, win_hostnameConfigurer le DNS, les routes, le nom d’hôte, etc.
Mises à jourwin_updates, win_hotfixInstaller les mises à jour Windows ou vérifier les correctifs installés.
Utilitaires diverswin_command, win_shell, win_statExécuter des commandes, scripts PowerShell, récupérer des informations système.

Gardez en tête que le préfixe win_ est votre meilleur repère : tous les modules commençant par win_ sont conçus pour fonctionner sur des hôtes Windows.

La collection community.windows est une collection communautaire qui complète la collection officielle ansible.windows. Elle est maintenue par des contributeurs externes et propose des modules supplémentaires pour répondre à des besoins spécifiques ou moins courants. Elle est particulièrement utile pour les utilisateurs d’Ansible qui souhaitent étendre les fonctionnalités d’Ansible sur Windows, en ajoutant des modules qui ne sont pas encore disponibles dans la collection officielle.

La collection community.windows regroupe des modules développés et maintenus par la communauté pour étendre les capacités d’Ansible sur les systèmes Windows. Elle complète la collection officielle ansible.windows en proposant des fonctionnalités spécifiques ou moins courantes, mais très utiles pour des besoins réels en entreprise ou en laboratoire.

Elle est particulièrement précieuse pour gérer Chocolatey, les modules PowerShell, les raccourcis, ou encore les variables d’environnement, autant de cas d’usage absents de la collection principale.

Voici un aperçu des domaines couverts par community.windows, avec quelques modules représentatifs :

DomaineExemples de modulesPour quoi faire ?
Gestion des paquetswin_chocolateyInstaller, mettre à jour ou désinstaller des logiciels via Chocolatey.
Environnement PowerShellwin_psmodule, win_psrepositoryInstaller des modules PowerShell depuis PSGallery ou autres dépôts.
Variables d’environnementwin_environmentCréer, modifier ou supprimer des variables d’environnement système ou utilisateur.
Gestion des cheminswin_pathAjouter ou retirer des entrées dans la variable PATH.
Raccourcis Windowswin_shortcutCréer ou modifier des raccourcis .lnk sur le bureau ou dans le menu Démarrer.
Sécurité avancéewin_account_policy, win_audit_policy_systemGérer les stratégies de compte et les paramètres d’audit.
Messages utilisateurwin_messageAfficher des messages en popup aux utilisateurs connectés.
Manipulation d’objets COMwin_dcom_app, win_dscConfigurer des applications COM ou des scripts DSC.

Ces modules permettent une automatisation fine de nombreux aspects du système Windows, en s’appuyant sur des outils natifs comme PowerShell ou les APIs COM.

Ansible est un outil puissant pour gérer des systèmes Windows, que ce soit via WinRM ou OpenSSH. Le choix entre les deux dépend de vos besoins spécifiques, de votre environnement et de votre familiarité avec les outils.