Ansible 101: Cambiando el wallpaper de un servidor

Ansible 101: Cambiando el wallpaper de un servidor

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:

  1. Conecta al servidor Ubuntu: Accede al servidor Ubuntu a través de una conexión SSH u otro método de acceso remoto.

  2. 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
    
  3. Instala Ansible: Una vez que el sistema esté actualizado, puedes instalar Ansible ejecutando el siguiente comando:

     sudo apt install ansible
    
  4. 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:

  1. 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.

  2. 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.

  3. 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
    
  4. 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.