Cómo configurar y usar Ansible para administrar hosts de Windows
Administrar servidores o estaciones de trabajo Windows con Ansible ya no es una fantasía. Es un poco extraño, pero con la configuración correcta, puedes enviar configuraciones, ejecutar scripts o incluso implementar software en tus equipos Windows de forma remota desde Linux. El problema es que Windows no está diseñado de forma nativa para la administración remota al estilo Ansible; depende de WinRM, lo cual puede ser complicado de configurar correctamente. Si alguna vez has intentado conectarte y has recibido errores como «kerberos: Respuesta HTTP incorrecta» o «inaccesible», es probable que se trate de un WinRM mal configurado o de problemas de red. Esta guía te ayudará a cubrir los aspectos básicos, desde la activación de WinRM hasta la autenticación con Kerberos o incluso HTTPS, para que finalmente puedas automatizar algunas de estas tediosas tareas de Windows. Es normal que tengas que manipular la línea de comandos, pero una vez configurado, ejecutar comandos o playbooks debería ser mucho menos frustrante. Un aviso: no siempre es una solución plug-and-play perfecta. A veces, el error que ves se debe a diferentes peculiaridades de configuración, como tráfico sin cifrar, puertos no coincidentes o entornos de dominio y grupo de trabajo. Si tienes problemas, esto suele ayudarte.
Cómo solucionar problemas comunes de administración de Windows con Ansible
Configurar hosts de Windows para Ansible
Por qué ayuda: Windows debe estar listo para aceptar comandos remotos de Ansible, lo que significa habilitar WinRM correctamente. Cuando esto no está configurado, obtendrá errores de conexión, tiempos de espera o fallas de autenticación. Aplicar la configuración correcta hace que sus máquinas escuchen, se autentiquen y respondan sin problemas.Cuándo aplica: Si ve errores al intentar conectarse con WinRM o es totalmente nuevo en la configuración, especialmente en máquinas Windows independientes o unidas a un dominio.Qué esperar: Después de configurar WinRM, debería poder hacer ping a sus hosts Windows desde Linux usando Ansible y ejecutar módulos simples como `win_ping`.Cómo hacerlo: – Verifique su versión de Windows PowerShell: powershell $PSVersionTable. PSVersion Asegúrese de que sea al menos 3.0, pero idealmente más reciente. También, confirme que. NET Framework 4.0+ esté instalado.- Habilite WinRM. Para equipos independientes, ejecute PowerShell como administrador e introduzca: powershell Enable-PSRemoting -Force. Esto configura el receptor de WinRM para que acepte comandos remotos y abre los puertos necesarios del firewall. Para verificar que WinRM esté escuchando: powershell Get-WSManInstance -ResourceURI winrm/config/Listener. Debería aparecer un receptor HTTP en el puerto 5985 o HTTPS en el 5986 si ha configurado SSL. Asegúrese de que los puertos TCP sean accesibles. Desde el host Linux, pruebe con: bash nc -zv 192.168.1.100 5985 (Reemplace la IP con su host Windows).Quiere un mensaje de «éxito».Para entornos de un grupo de trabajo (no AD), es posible que deba permitir el tráfico sin cifrar y la autenticación básica: powershell Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value true Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value true Además, configure el firewall según corresponda. Para equipos unidos a un dominio, es más sencillo porque Kerberos suele estar configurado. Pero si no es así, o si Kerberos no funciona, puede cambiar a NTLM o a la autenticación por certificado. En algunas configuraciones, deberá ajustar las directivas de grupo para habilitar WinRM, especialmente si está deshabilitado por defecto.- Para una configuración rápida, puede ejecutar este script en Windows (o obtener el script desde [aquí](https://github.com/ansible/ansible-documentation/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1)): powershell iex (New-Object Net. WebClient).DownloadString(‘https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1’) – Y si no está seguro o está realizando pruebas, recuerde configurar `$env:ANSIBLE_WINRM_PROTOCOL = «http»` o configurar `ansible_winrm_scheme` en consecuencia.
Asegúrese de que sus puertos y autenticación estén configurados correctamente
Por qué ayuda: A veces, WinRM usa HTTPS por defecto, pero es posible que tu servidor solo tenga HTTP habilitado o que las reglas del firewall bloqueen el puerto 5985. O quizás tu método de autenticación no coincida con el configurado.Cuándo aplica: Si `ansible` indica que no puede acceder al host, o si obtienes estados «inalcanzable» o errores sobre la respuesta HTTP.Qué esperar: Después de corregir los problemas de puerto, firewall y autenticación, `ansible windows_hosts -m win_ping` debería responder correctamente.Cómo hacerlo: – Si sus hosts solo escuchan en HTTP (puerto 5985), asegúrese de que su inventario de Ansible lo refleje: ini [windows_all:vars] ansible_port=5985 ansible_connection=winrm ansible_winrm_transport=basic ansible_winrm_scheme=http ansible_winrm_server_cert_validation=ignore Para HTTPS, cambie al puerto 5986 y configure el transporte en kerberos o basado en certificados.- A veces, WinRM requiere HTTPS de forma predeterminada con certificados de confianza, lo que puede ser una molestia. Cuando use HTTP sin cifrar, debe permitirlo explícitamente, como se mostró anteriormente.- En PowerShell en Windows, para permitir el tráfico sin cifrar: powershell Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value true – Asegúrese de que el Firewall de Windows no esté bloqueando estos puertos, ya sea manualmente o a través de la Política de grupo.
Comandos de ejecución y libros de jugadas
Una vez configurados los componentes básicos, prueba algo sencillo para confirmar que todo funciona: bash ansible windows_all -m win_ping. Si el resultado es correcto, estás listo. Para más información, como vaciar el DNS en todas las unidades: bash ansible windows_all -m win_shell -a «ipconfig /flushdns» o ejecuta un script de PowerShell: crea tu playbook `.yml`, por ejemplo `win-exec-powershell.yml`, así: yaml — – name: Ejecutar comando de PowerShell hosts: windows_all task: – name: Obtener información de DNS win_shell: | Get-DnsClientServerAddress -InterfaceIndex (Get-NetAdapter|Where-Object { $_. Status -eq «Up» }).ifIndex register: dns_info – name: Mostrar información de DNS ansible.builtin.debug: var: dns_info Y ejecutar: bash ansible-playbook /etc/ansible/playbooks/win-exec-powershell.yml Todos estos módulos (copiar archivos, crear/eliminar archivos, instalar MSI, administrar servicios o abrir puertos) son sencillos una vez que WinRM funciona bien.—
Por supuesto, si sus hosts de Windows están en un grupo de trabajo o tienen firewalls que bloquean el tráfico, podría necesitar ajustar la configuración de seguridad o considerar configurar el Subsistema de Windows para Linux (WSL) para ejecutar Ansible de forma nativa en Windows. En resumen, es un poco complicado, pero totalmente factible una vez que se le coge el ritmo.
Resumen
- Asegúrese de que WinRM esté habilitado y escuchando en los puertos 5985/5986.
- Configure firewalls para permitir el tráfico en esos puertos.
- Establecer el método de autenticación apropiado (Kerberos, NTLM, básico).
- Pruebe la conectividad con `nc` o los comandos `Test-WSMan` de PowerShell.
- Utilice variables de inventario correctas para las configuraciones de puerto, transporte y SSL.
- Comience con `win_ping` para confirmar que todo está bien antes de ejecutar tareas más complejas.
Resumen
Conseguir que Ansible administre hosts de Windows no siempre es fácil; Windows prefiere hacer las cosas a su manera. Pero una vez que la configuración de WinRM está bien establecida, automatizar tareas repetitivas se vuelve mucho más fácil. A mí me funcionó; espero que ayude a alguien a evitar la interminable búsqueda en Google. Cruzo los dedos para que esto te ayude a dominar la automatización.