Aller au contenu

Ansible Windows : WinRM vs OpenSSH

Mise à jour :

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.

Prérequis

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.

Coté Hôte Windows

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.

Coté Controlleur Ansible

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

Terminal window
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.

Utilisation de WinRM

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.

Configuration de l’écouteur WinRM

1. Activation de WinRM sur la machine Windows

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

Terminal window
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 :

Terminal window
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 :

Terminal window
winrm quickconfig -transport:https

Ou via PowerShell :

Terminal window
$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 :

Terminal window
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "LocalAccountTokenFilterPolicy" -Value 1 -PropertyType DWORD -Force

Pour activer l’authentification Basic :

Terminal window
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 :

Terminal window
$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.

Les plugins de connexion

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 (par défaut)

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 :

Terminal window
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

Le plugin psrp (PowerShell Remoting Protocol)

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 :

Terminal window
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

Que choisir : winrm ou psrp ?

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.

Utilisation d’OpenSSH

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.

Installation du serveur OpenSSH sur Windows

1. Activer le composant OpenSSH Server

Dans PowerShell en tant qu’administrateur :

Terminal window
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

2. Démarrer et activer le service SSHD

Terminal window
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

3. Ouvrir le port 22 dans le pare-feu

Terminal window
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Configuration du shell par défaut (PowerShell)

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

Terminal window
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.

Configuration de l’inventaire Ansible

[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.

Bonnes pratiques

  • 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.

Limitations connues

  • 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

Comparaison entre WinRM et OpenSSH

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.

Tableau comparatif

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

Quand utiliser WinRM ?

  • 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

Quand utiliser OpenSSH ?

  • 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

Test de la connexion

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

Terminal window
ansible windows -i inventory.ini -m win_ping

Réponse attendue :

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

Les collections Ansible pour Windows

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.

Installation des collections

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

Terminal window
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 :

Terminal window
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 :

Terminal window
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 :

Terminal window
ansible-galaxy collection install -r requirements.yml

La collection ansible.windows

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.

Présentation

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é.

Portée fonctionnelle

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

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.

Présentation

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.

Portée fonctionnelle

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.

Conclusion

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.