Fix Ansible WinRM Connection Errors

The Error

fatal: [windows-host]: UNREACHABLE! => {
    "changed": false,
    "msg": "winrm or requests is not installed: No module named 'winrm'",
    "unreachable": true
}

Step 1: Install pywinrm

pip install pywinrm
# Or with Kerberos support
pip install pywinrm[kerberos]

Step 2: Configure Inventory

[windows]
win1 ansible_host=192.168.1.100

[windows:vars]
ansible_user=Administrator
ansible_password=SecureP@ss123
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore
ansible_port=5986

Step 3: Enable WinRM on Windows

Run this PowerShell script on the Windows host as Administrator:

# Quick setup (HTTP - for testing only)
winrm quickconfig -force

# Enable HTTPS (production)
$cert = New-SelfSignedCertificate -DnsName $(hostname) -CertStoreLocation Cert:\LocalMachine\My
winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname=`"$(hostname)`";CertificateThumbprint=`"$($cert.Thumbprint)`"}"

# Allow basic auth
Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true
Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value $true

# Open firewall
New-NetFirewallRule -Name "WinRM-HTTPS" -DisplayName "WinRM HTTPS" -Protocol TCP -LocalPort 5986 -Action Allow

Or use the Ansible-provided script:

Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible-documentation/main/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
.\ConfigureRemotingForAnsible.ps1

Common Errors

Connection Refused (port 5985/5986)

# Check if WinRM is listening
Test-NetConnection -ComputerName windows-host -Port 5986

Certificate Validation Error

# Ignore cert validation (self-signed certs)
ansible_winrm_server_cert_validation=ignore

Authentication Failed

# Try different transport methods
ansible_winrm_transport=ntlm      # Most common
ansible_winrm_transport=basic     # Simple but less secure
ansible_winrm_transport=kerberos  # Domain environments
ansible_winrm_transport=credssp   # CredSSP delegation

Timeout Error

ansible_winrm_operation_timeout_sec=60
ansible_winrm_read_timeout_sec=120

Test Connection

ansible windows -m win_ping -i inventory.ini

Conclusion

WinRM setup requires configuration on both the Ansible controller (pywinrm) and the Windows host (WinRM listener). Use HTTPS in production, NTLM for authentication, and the Ansible-provided setup script for quick configuration.