Ansible es capaz de conectar y automatizar tareas no solamente con equipos GNU/Linux, sino también con equipos Windows. En este tutorial aprenderemos a crear a modo de ejemplo un usuario de forma automática con Ansible en un equipo remoto Windows 7 para comprobar que Ansible funciona a la perfección.
Seguid leyendo y os enseñaré a configurar Windows para poder conectarlo a Ansible...
¿QUÉ ES ANSIBLE?
Ansible es una plataforma de software libre para configurar y administrar ordenadores. Combina instalación multi-nodo (es decir: permite desplegar configuraciones de servidores y servicios por lotes), ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como una herramienta de orquestación. Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior para instalarlo). Dispone de módulos que trabajan sobre JSON y la salida estándar puede ser escrita en cualquier lenguaje. Nativamente, utiliza YAML para describir configuraciones reusables de los sistemas.
Ventajas:
- No necesita instalar agentes
- Solo se necesita tener instalado Python en los equipos administrados
- Gran biblioteca pública de módulos para aumentar su funcionalidad
Web: https://www.ansible.com/
Ansible es una herramienta típica de DevOPS para automatizar tareas y configuraciones
1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL
- Un PC con GNU/Linux Debian (o similar) y Ansible instalado
- Un PC con Windows 7 o superior
2.- CONFIGURAR LOS EQUIPOS WINDOWS
Para que Ansible funciona correctamente, se deben de cumplir una serie de requisitos previos en los equipos con Windows.
PowerShell v3.0 ó superior
Para comprobar la versión de PowerShell que tenemos instalada, abriremos una terminal de PowerShell y ejecutaremos el siguiente comando:
(Get-Host).version
Versión de Powershell
.NET 4.0 ó superior
Para comprobar la versión del .NET que tenemos instalada (puede haber varias versiones), abriremos una consola de PowerShell y ejecutaremos el siguiente comando:
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, version
Versión de .NET
WinRM instalado y escuchando
El servicio de Windows Remote Management (WinRM) deberá estar arrancado para que la comunicación entre Ansible y los equipos Windows funcione correctamente. Para arrancarlo, iremos a Servicios y lo arrancaremos con botón derecho "Arrancar/Start":
Servicio WinRM arrancado
Debemos tener configurado correctamente WinRM para que acepte peticiones. Para ello, desde una terminal de Administrador, ejecutaremos el siguiente comando y aceptaremos todas las preguntas que nos haga el asistente:
winrm quickconfig
En la siguiente imagen se pueden ver las preguntas que nos hace el asistente:
Configurar WinRM
3.- CONFIGURAR ANSIBLE
Partiremos de la base que tenemos instalado Ansible en nuestro equipo. Una vez instalado, deberemos instalar también python3-pip para poder instalar paquetes de python. Para ello ejecutaremos el comando siguiente:
raul@debian:~$ sudo apt-get install python3-pip
Una vez instalado PIP, instalaremos pywinrm para poder comunicar Ansible y equipos windows a través de Windows Remote Management. Ejecutaremos el siguiente comando:
raul@debian:~$ sudo pip3 install pywinrm
Aunque existen diferentes formas de configurar y ordenar los hosts manejados por Ansible, vamos a realizar la configuración más básica para manejar un equipo cliente con Windows 7. Para ello, editaremos el fichero /etc/ansible/hosts y añadiremos las siguientes líneas, donde deberemos cambiar la IP del equipo Windows y el usuario y la contraseña. Se recomienda usar otro usuario administrador diferente al "Administrador" por defecto. El resto de parámetros los dejaremos igual:
[win]
192.168.1.78
[win:vars]
ansible_ssh_user = ansible
ansible_ssh_pass = ansible
ansible_ssh_port = 5985
ansible_connection = winrm
ansible_winrm_transport = basic
ansible_winrm_server_cert_validation = ignore
La configuración de Ansible es tan sencilla como la configuración arriba indicada. Creamos un grupo de hosts llamado "win" y se le asignan una seria de variables a dicho grupo con "win:vars". Lógicamente, el nombre del grupo puede ser otro.
4.- PROBAR LA CONEXIÓN ENTRE ANSIBLE Y WINDOWS
Para comprobar si la conectividad y la configuración entre Ansible y el equipo con Windows es correcta, ejecutaremos el siguiente comando que debe mostrar un mensaje de éxito en color verde:
raul@debian:~$ ansible win -m win_ping
Deberemos obtener un mensaje de conexión exitosa con una respuesta SUCCESS como en la siguiente imagen:
Conexión WinRM satisfactoria
Si obtenemos el siguiente error "basic: the specified credentials were rejected by the server", aplicar los cambios del paso 6 y probar de nuevo.
5.- CREAR UN USUARIO REMOTO CON ANSIBLE
Para comprobar que efectivamente podemos automatizar tareas en los equipos Windows gestionados con Ansible, vamos a crear un pequeño Playbook (script) para Ansible el cual creará un usuario local en el equipo remoto Windows 7. Crearemos el siguiente fichero /etc/ansible/win-create-user.yml:
---
- name: "Create user on Windows Machine"
hosts: win
tasks:
- name: "Check Windows machines access using win_ping"
win_ping:
- name: Create new user
win_user:
name: raul
password: raul
state: present
groups:
- Users
El equipo Windows remoto tiene solamente los siguientes usuarios creados:
Usuarios Windows
Ahora, para ejecutar el Playbook ejecutaremos el siguiente comando:
raul@debian:~$ ansible-playbook win-create-user.yml
El Playbook comenzará a ejecutarse y en cada paso nos irá mostrando la salida:
Ejecución del Playbook
Si refrescamos la lista de usuarios del equipo remoto, veremos que efectivamente el usuario ha sido creado satisfactoriamente:
Usuario creado desde Ansible
6.- SOLUCIÓN A PROBLEMAS DE CONEXIÓN CON WINRM
Si a la hora de realizar la prueba de conexión obtenemos un mensaje como "basic: the specified credentials were rejected by the server", abriremos una consola de PowerShell en modo Administrador y ejecutaremos los siguientes dos comandos:
Set-Item -Force WSMan:\localhost\Service\auth\Basic $true
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Una vez ejecutados, volveremos a probar la conexión debería realizarse de forma correcta:
Problema de conexión
ENJOY!