Cuando te enfrentas a una nueva tecnología, es importante escoger bien los casos de uso que quieres probar.
Han de ser simples, pero efectivos en términos de conocimiento, para que al completarlos extraigas un aprendizaje suficiente por el que merezca la pena el tiempo invertido.
Llevo unas semanas empezando a trabajar con Ansible y este primer caso de uso parece sencillo, pero implica tener claros conceptos esenciales de la tecnología:
Caso de Uso:
Quiero cambiar el fondo de pantalla de N servidores Windows 2022 server desde Ansible decidiendo qué fondo de pantalla van a mostrar a los usuarios que se conecten.
Requisitos:
Aunque originalmente no existía ningún requisito previo, a lo largo del diseño e implementación de la solución, surgió la necesidad de que el cambio de fondo de pantalla fuera aplicado a todos los usuarios del servidor.
Preparación del entorno
Ya dispongo de una máquina virtual en mi entorno de pruebas con Ubuntu 20.04 LTS instalado.
Puedes utilizar otra distribución de Linux que te guste más, pero para estas pruebas utilizaré esta por ser la que mejor soporte de la comunidad suele tener.
Para instalar Ansible en un servidor Ubuntu, puedes seguir estos pasos:
Conecta al servidor Ubuntu: Accede al servidor Ubuntu a través de una conexión SSH u otro método de acceso remoto.
Actualiza el sistema: Antes de instalar Ansible, asegúrate de tener el sistema actualizado. Ejecuta los siguientes comandos en la terminal:
sudo apt update sudo apt upgrade
Instala Ansible: Una vez que el sistema esté actualizado, puedes instalar Ansible ejecutando el siguiente comando:
sudo apt install ansible
Verifica la instalación: Después de completar la instalación, puedes verificar si Ansible se ha instalado correctamente ejecutando el siguiente comando:
ansible --version
Esto mostrará la versión de Ansible instalada y otros detalles.
Una vez tenemos nuestra máquina con Ansible listo para funcionar hemos de realizar unos pequeños pasos previos en nuestro servidor objetivo.
Al tratarse de un sistema Windows, necesitaremos configurar WinRM
en la máquina sobre la que queremos que Ansible ejecute sus acciones.
Para preparar una máquina Windows Server 2022 para que Ansible pueda trabajar con ella, he seguido estos pasos:
WinRM (Windows Remote Management) es el protocolo utilizado por Ansible para la comunicación con máquinas Windows. Para habilitar WinRM en la máquina Windows Server 2022, abre una ventana de PowerShell con privilegios elevados y ejecuta el siguiente comando:
winrm quickconfig
Este comando configura WinRM y habilita el acceso remoto.
Configura la autenticación de WinRM: Por defecto, WinRM utiliza la autenticación básica, que no es segura para entornos de producción. Para habilitar la autenticación segura, ejecuta los siguientes comandos en la ventana de PowerShell:
Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $false Set-Item -Path WSMan:\localhost\Service\Auth\Negotiate -Value $true Set-Item -Path WSMan:\localhost\Service\Auth\Kerberos -Value $true
Estos comandos deshabilitan la autenticación básica y habilitan la autenticación segura mediante negociación y Kerberos.
Reinicia el servicio WinRM: Para aplicar los cambios de configuración realizados en WinRM, reinicia el servicio ejecutando el siguiente comando en la ventana de PowerShell:
Restart-Service WinRM
Asegúrate de que la máquina Windows Server 2022 sea accesible desde el servidor Ansible: Verifica que la máquina Windows Server 2022 pueda ser alcanzada desde el servidor donde tienes instalado Ansible.
Así mismo, es conveniente crear un usuario ansible con permisos de administrador en la máquina objetivo para que sea esa cuenta la que ejecute los comandos elevados.
Creación del playboook de Ansible
Una vez nuestro servidor destino ha sido configurado para trabajar con Ansible, ya podemos crear nuestro primer playbook.
Un playbook de Ansible es un archivo que contiene la descripción y la lógica para automatizar tareas y configuraciones en un entorno de TI, permitiendo la gestión y orquestación de infraestructuras de forma declarativa y programática.
Está escrito en YAML y proporciona, paso a paso, el proceso que debe seguir nuestro orquestador de configuración para alcanzar el estado deseado.
En enuestro caso, varias van a ser las tareas que vamos a realizar, y las describiremos en cada una de las entradas de tasks
- name: Set Windows Server wallpaper
hosts: windows_server
gather_facts: false
tasks:
- name: Create Temp folder
win_file:
path: C:\Temp
state: directory
- name: Copy wallpaper file
win_copy:
src: /home/smadrigal/img/wallpaper.jpg
dest: C:\Temp\wallpaper.jpg
- name: Retrieve user profiles from the registry
win_shell: |
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
$profiles = Get-ChildItem -Path "HKU:/" | Where-Object { $_.Name -notmatch 'S-1-5-18|S-1-5-19|S-1-5-20|DEFAULT' } | Select-Object -ExpandProperty PSChildName
Write-Output ($profiles -join ",")
register: user_profiles
- name: Set wallpaper registry key for all user profiles
win_regedit:
path: "HKU:\\{{ item }}\\Control Panel\\Desktop"
name: Wallpaper
data: C:\Temp\wallpaper.jpg
type: string
loop: "{{ user_profiles.stdout.split(',') }}"
- name: Update the wallpaper style registry key for all user profiles
win_regedit:
path: "HKU:\\{{ item }}\\Control Panel\\Desktop"
name: WallpaperStyle
data: 2
type: string
loop: "{{ user_profiles.stdout.split(',') }}"
- name: Update the wallpaper tile registry key for all user profiles
win_regedit:
path: "HKU:\\{{ item }}\\Control Panel\\Desktop"
name: TileWallpaper
data: 0
type: string
loop: "{{ user_profiles.stdout.split(',') }}"
- name: Refresh the wallpaper for all user profiles
win_command: rundll32.exe user32.dll, UpdatePerUserSystemParameters
El playbook es algo complejo por las siguientes razones:
Debemos actualizar el wallpaper de todos los usuarios del servidor
Esto se realiza modificando un valor del registro HKCU (HKey Current User)
Necesitamos por tanto:
Obtener todos los usuarios disponsibles en el servidor
Modificar, mediante un bucle, cada uno de los valores de registro de HKCU de esos usuarios
Ejecución del playbook
Una vez tenemos listo el playbook, preparamos la lista de servidores objetivo. En nuestro caso sólo va a ser uno, pero esto podría aplicarse a una lista de servidores de forma totalmente automatizada.
Creamos, por tanto, el inventory.ini, que va a contener la lista de nuestros servidores agrupados:
[windows_server]
server01 ansible_host=172.18.231.71
[windows_server:vars]
ansible_user=ansible
ansible_password=PasswordOfUSer
ansible_port=5986
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_server_cert_validation=ignore
Ya estamos en disposición de ejecutar nuestro comando:
ansible-playbook -i inventory.ini wallpaper.yml
Si todo va bien, nuestro servidor habrá cambiado su fondo de pantalla para todos los usuarios
Conclusiones
A primera vista podemos interpretar que hay un exceso de configuración necesaria para poder automatizar algo tan trivial como cambiar el fondo de pantalla, pero una mirada algo más pausada nos ofrece una perspectiva clara de la utilidad de Ansible.
Automatizar un sinfín de procesos, scripts, o acciones, ha sido siempre una tarea compleja que los administradores de sistemas han tenido que ir salvando como buenamente podían.
Ansible permite hacerlo de una forma consistente y ordenada, asociar nuestro código a herramientas de source control como git, y estandarizar los procesos.
La transición puede no resultar sencilla, y cada caso de uso requiere un análisis inicial y unas pruebas concretas, pero la implementación de una solución como Ansible en el medio plazo va a proporcionar muchas ventajas en la administración de sistemas.