Ai/automazione

Ansible Windows: Gestión de Servidores con WinRM y Módulos Core

Ansible Windows: Gestión de Servidores con WinRM y Módulos Core

La automatización es la clave para la gestión eficiente de infraestructuras IT complejas. Cuando hablamos de entornos mixtos, donde Linux y Windows conviven, Ansible emerge como una herramienta potente y flexible. He visto en primera persona cómo la gestión manual de cientos de servidores Windows puede convertirse en una pesadilla operativa: parchar manualmente 350 servidores cada mes significaba 3 días de trabajo intensivo, con una alta probabilidad de errores humanos. Esto no es solo un desperdicio de recursos, sino un riesgo constante para la seguridad y la estabilidad de la infraestructura. La introducción de Ansible, configurado correctamente con WinRM, revolucionó este proceso, reduciendo el tiempo de ejecución a solo 45 minutos con logs centralizados y la posibilidad de rollback automático. Este artículo explora cómo aprovechar Ansible para orquestar servidores Windows, centrándose en la configuración segura de WinRM, el uso de módulos core y escenarios prácticos de automatización, incluyendo la gestión de Active Directory y el patching.

Requisitos Previos / Entorno de Prueba

Antes de poder gestionar servidores Windows con Ansible, es fundamental asegurarse de que los requisitos previos estén satisfechos. El protocolo clave para la comunicación entre el controlador Ansible (típicamente Linux) y los hosts Windows es WinRM (Windows Remote Management). Este servicio, basado en SOAP, permite la ejecución remota de comandos PowerShell y el acceso a datos WMI. Para un funcionamiento óptimo y seguro, los servidores Windows objetivo deben tener:

  • Windows Management Framework (WMF) 5.1 o superior: Incluye PowerShell 5.1, que mejora las capacidades de scripting y la fiabilidad de WinRM. Muchas versiones de Windows Server modernas lo incluyen de forma predeterminada, pero para las más antiguas podría ser necesaria una actualización.
  • .NET Framework 4.5 o superior: Necesario para el correcto funcionamiento de PowerShell y WinRM.

Asegurarse de que estos componentes estén actualizados es el primer paso para evitar problemas de conectividad y compatibilidad. Es un error que he visto repetidamente: intentar configurar Ansible en servidores Windows con versiones obsoletas de PowerShell, lo que lleva a errores crípticos y pérdida de tiempo valioso.

Configuración de WinRM para Conexiones Ansible (Seguro vía HTTPS)

La configuración de WinRM es el corazón de la comunicación entre Ansible y los servidores Windows. Para fines de seguridad, es imperativo configurar WinRM para utilizar HTTPS. Esto garantiza que todas las comunicaciones estén cifradas, protegiendo las credenciales y los datos intercambiados.

En el servidor Windows, abra una consola PowerShell como administrador y ejecute:

winrm quickconfig
Set-Item WSMan:\localhost\Service\AllowUnencrypted $false

El comando winrm quickconfig configura los listeners WinRM básicos y abre los puertos de firewall necesarios. Set-Item WSMan:\localhost\Service\AllowUnencrypted $false deshabilita las conexiones no cifradas, una buena práctica fundamental. Para HTTPS, se necesita un certificado SSL (autofirmado para pruebas, firmado por una CA para producción) y configurar un listener HTTPS. Este es un paso a menudo pasado por alto, pero crítico para el cumplimiento (ej. NIS2 art. 21) y la protección de los datos.

# Crear un certificado autofirmado (SOLO PARA PRUEBAS)
$cert = New-SelfSignedCertificate -DnsName "$env:COMPUTERNAME" -CertStoreLocation Cert:\LocalMachine\My

# Crear un listener HTTPS
winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="$env:COMPUTERNAME"; CertificateThumbprint="$(\$cert.Thumbprint)"}

# Abrir el puerto 5986 en el firewall (si no está ya abierto por quickconfig)
New-NetFirewallRule -DisplayName "WinRM HTTPS" -Direction Inbound -LocalPort 5986 -Protocol TCP -Action Allow

Verifique que el puerto 5986 (HTTPS predeterminado para WinRM) sea accesible desde el controlador Ansible y que el certificado sea de confianza. En entornos empresariales, un certificado emitido por una CA interna es el estándar.

Inventario y Variables para Hosts Windows

Para Ansible, los hosts Windows se definen en el archivo de inventario, al igual que los hosts Linux. La diferencia radica en las variables de conexión específicas para WinRM.

Aquí tiene un ejemplo de inventory.ini:

[windows_servers]
winserver01.example.com
winserver02.example.com

[windows_servers:vars]
ansible_port=5986
ansible_connection=winrm
ansible_winrm_transport=kerberos # o ntlm, o basic si https
ansible_winrm_server_cert_validation=ignore # o validate para certificados CA válidos
ansible_user=Administrator
ansible_password='YourStrongPassword'
# ansible_winrm_kinit_mode=always # Para Kerberos
# ansible_winrm_kerberos_delegation=true # Para Kerberos

Las variables clave son:

  • ansible_port: 5986 para HTTPS, 5985 para HTTP.
  • ansible_connection: debe ser winrm.
  • ansible_winrm_transport: kerberos para entornos Active Directory (altamente recomendado), ntlm como fallback, o basic si se usa HTTPS y no se tiene Kerberos. El basic con HTTPS es un compromiso aceptable para entornos menos complejos.
  • ansible_winrm_server_cert_validation: ignore es útil para pruebas con certificados autofirmados, pero en producción se usará validate si el certificado es válido y de confianza.

Para probar la conexión, use el módulo win_ping:

ansible windows_servers -m win_ping -i inventory.ini

Si la conexión tiene éxito, recibirá un pong de respuesta. Esto confirma que WinRM está configurado correctamente y que Ansible puede comunicarse con el host Windows.

Módulos Core: win_package, win_service, win_file, win_reg

Ansible ofrece un conjunto rico de módulos específicos para Windows que permiten gestionar prácticamente cada aspecto de un servidor. Estos módulos son idempotentes, lo que significa que pueden ejecutarse varias veces sin causar efectos secundarios no deseados.

  • win_package: Instala, desinstala o actualiza paquetes de software MSI o ejecutables. Usé este módulo para distribuir agentes EDR en 2.000 estaciones de trabajo.
    - name: Instalar 7-Zip
      win_package:
        path: 'C:\temp\7z1900-x64.msi'
        product_id: '{23170F69-40C1-2702-1900-000001000000}' # ID del producto MSI
        state: present
  • win_service: Gestiona el estado de los servicios de Windows (iniciado, detenido, reiniciado, deshabilitado, habilitado).
    - name: Asegurar que el servicio Spooler esté en ejecución y en automático
      win_service:
        name: Spooler
        state: started
        start_mode: auto
  • win_file: Crea, modifica o elimina archivos y directorios, establece permisos.
    - name: Crear un directorio
      win_file:
        path: C:\ansible_logs
        state: directory
  • win_reg: Gestiona las claves y valores del registro de sistema de Windows.
    - name: Establecer un valor de registro
      win_reg:
        path: HKLM:\SOFTWARE\MyCompany
        name: 'Setting1'
        data: 'Value1'
        type: string
        state: present

Estos son solo algunos ejemplos; la documentación de Ansible para los módulos Windows es extensa y cubre múltiples escenarios de gestión.

Gestión de Usuarios y Grupos de Active Directory con Ansible

La automatización de la gestión de Active Directory es un área donde Ansible puede aportar enormes beneficios, especialmente en entornos empresariales con cambios frecuentes de personal o requisitos de conformidad. Los módulos win_ad_user, win_ad_group, win_domain_controller (y otros) permiten interactuar directamente con AD.

- name: Crear un nuevo usuario de AD
  win_ad_user:
    name: 'jdoe'
    firstname: 'John'
    surname: 'Doe'
    password: 'SuperSecurePassword123!'
    enabled: yes
    state: present
    path: 'OU=Users,OU=MyDept,DC=example,DC=com'

- name: Añadir usuario a un grupo
  win_ad_group_membership:
    name: 'SG_IT_Admins'
    members: 'jdoe'
    state: present
    scope: domainlocal

Automatizar la creación y gestión de cuentas de usuario y grupos en AD reduce significativamente los errores manuales y garantiza que las políticas de seguridad (como el art. 21 de la NIS2 que requiere controles de acceso) se apliquen de forma consistente. He utilizado esta funcionalidad para automatizar el aprovisionamiento de nuevos empleados, reduciendo el tiempo de onboarding de horas a pocos minutos.

Instalación y Configuración de Software vía Chocolatey

Chocolatey es un gestor de paquetes para Windows, similar a apt en Debian/Ubuntu o yum en CentOS/RHEL. Integrar Chocolatey con Ansible simplifica enormemente la instalación y gestión del software a gran escala.

Primero, asegúrese de que Chocolatey esté instalado (mediante PowerShell o un playbook Ansible):

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'))

Una vez instalado, se puede usar el módulo Ansible win_chocolatey:

- name: Instalar Google Chrome vía Chocolatey
  win_chocolatey:
    name: googlechrome
    state: present

- name: Asegurar que Notepad++ esté en la última versión
  win_chocolatey:
    name: notepadplusplus
    state: latest

Este enfoque centraliza la gestión del software, garantizando que las aplicaciones se instalen de forma consistente y se mantengan actualizadas en todos los servidores. La adopción de un gestor de paquetes es una buena práctica moderna también en el entorno Windows.

Playbook Completo: Parcheo Mensual de Windows

Aquí un ejemplo de playbook Ansible para automatizar el proceso de parcheo mensual de los servidores Windows. Este playbook instala las actualizaciones críticas y de seguridad, gestiona los reinicios y asegura que el sistema esté completamente actualizado.

---
- name: Parcheo Mensual de Windows
  hosts: windows_servers
  gather_facts: no
  tasks:
    - name: Comprobar reinicios pendientes antes del parcheo
      win_reboot_info:
      register: reboot_info

    - name: Reiniciar si se detecta un reinicio pendiente
      win_reboot:
      when: reboot_info.pending_reboot

    - name: Instalar actualizaciones de Windows
      win_updates:
        category_names: ['SecurityUpdates', 'CriticalUpdates']
        reboot: yes
        log_path: C:\Windows\AnsiblePatching.log
        state: installed
      register: update_result

    - name: Informar estado de la actualización
      debug:
        msg: "Actualizaciones instaladas: {{ update_result.updates | length }}. Reinicio requerido: {{ update_result.reboot_required }}."

    - name: Reiniciar si es necesario después de las actualizaciones
      win_reboot:
      when: update_result.reboot_required

    - name: Asegurar que todas las actualizaciones se comprueban y aplican (opcional, segundo paso)
      win_updates:
        category_names: ['SecurityUpdates', 'CriticalUpdates']
        state: installed
      register: second_pass_result

    - name: Reinicio final si el segundo paso requirió uno
      win_reboot:
      when: second_pass_result.reboot_required

Este playbook es un ejemplo robusto: gestiona los posibles reinicios pre-parcheo, instala las actualizaciones, reinicia si es necesario y puede ejecutar un segundo paso para capturar posibles actualizaciones dependientes. Una automatización del parcheo como esta puede reducir el tiempo de inactividad, mejorar la conformidad y liberar al personal IT para tareas más estratégicas. He visto el porcentaje de servidores sin parchar bajar del 15% a menos del 1% gracias a un enfoque similar.

Errores Comunes y Resolución de Problemas

Cuando se usa Ansible con Windows, algunos problemas recurrentes pueden ralentizar la implementación:

  • WinRM no configurado correctamente: El problema más común. Verifique que el servicio esté en ejecución, los listeners estén activos (especialmente HTTPS en el puerto 5986) y el firewall esté abierto. Recuerde Set-Item WSMan:\localhost\Service\AllowUnencrypted $false.
  • Problemas de autenticación: Credenciales erróneas, problemas NTLM/Kerberos. Asegúrese de que el usuario especificado en ansible_user tenga los permisos necesarios en el servidor Windows. Para Kerberos, la configuración del lado del controlador Linux (keytab, /etc/krb5.conf) es fundamental.
  • Certificados SSL no válidos o no confiables: Si se usa HTTPS, el certificado debe ser válido y de confianza para el controlador Ansible. Usar ansible_winrm_server_cert_validation=ignore solo para pruebas no es una solución a largo plazo.
  • Versiones PowerShell/WMF obsoletas: Algunos módulos Ansible podrían no funcionar correctamente con versiones de PowerShell más antiguas. Asegúrese de que los servidores estén actualizados a PowerShell 5.1+.
  • Windows Defender/Firewall: A veces, las configuraciones agresivas de seguridad de Windows pueden bloquear las conexiones WinRM, incluso si la regla del firewall está activa. Revise los logs de eventos de Windows para obtener detalles.

Para la depuración, aumentar la verbosidad de Ansible con -vvv o -vvvv puede proporcionar información detallada sobre los errores de conexión y de ejecución de los módulos.

Conclusiones con Puntos Clave Operativos

La integración de Ansible para la gestión de servidores Windows ya no es un nicho, sino una práctica esencial para cualquier equipo IT que desee mejorar la eficiencia, seguridad y conformidad. Por un lado, se reduce drásticamente el tiempo dedicado a tareas repetitivas como el parcheo o la configuración inicial de nuevos servidores. Por otro lado, se aumenta la coherencia de las configuraciones, se minimizan los errores humanos y se obtiene una trazabilidad completa de cada operación, aspectos cruciales para auditorías y requisitos normativos como la NIS2. La inversión inicial en la configuración segura de WinRM y en el aprendizaje de los módulos Windows específicos se amortiza rápidamente en términos de tiempo ahorrado y mayor resiliencia de la infraestructura. La automatización con Ansible transforma un entorno Windows de una carga manual a un sistema gestionable con la misma agilidad que una infraestructura Linux.

Lee también: Lynis Audit Linux: Guía Práctica de Hardening 2026

Link externo: Ansible for Windows documentation

Comparte este artículo:

Escrito por

Rosario Giordano

Rosario Giordano es administrador de sistemas y consultor de TI especializado en c iberseguridad y cloud, con más de 20 años de experiencia en la gestión de infraestructuras Linux empresariales. Sus áreas de especialización incluyen el hardening de SSH, plataformas Kubernetes , bases de datos PostgreSQL, virtualización con VMware/Proxmox y el cumplimiento de los marcos de seguridad NIS2 e ISO 27001.