Automatizando la instalación de Moodle con Ansible: Una solución mágica para despliegues rápidos

Automatizando la instalación de Moodle con Ansible: Una solución mágica para despliegues rápidos

La automatización no es solo una herramienta; es una filosofía que transforma la forma en que abordamos los desafíos técnicos. En mi caso, la necesidad de instalar Moodle en múltiples servidores en un corto período de tiempo me llevó a explorar Ansible. Lo que comenzó como una solución temporal se convirtió en una práctica estándar en mi flujo de trabajo.

Ansible no solo me permitió completar la tarea en cuestión de minutos , sino que también me dio la confianza de que cada instalación era consistente y libre de errores. Además, me permitió documentar el proceso de manera clara y reproducible, lo cual es invaluable en entornos colaborativos.

En este artículo, no solo te mostraré cómo instalar Moodle con Ansible, sino que también te daré una visión general de cómo la automatización puede transformar tu enfoque hacia la administración de sistemas. Ya sea que estés gestionando un pequeño conjunto de servidores o una infraestructura a gran escala, Ansible puede ser tu aliado para simplificar tareas complejas y liberar tu tiempo para enfocarte en lo que realmente importa.

Si deseas explorar otra alternativa para la instalación de Moodle, puedes consultar mi guía paso a paso sobre cómo instalar Moodle 4.5 utilizando Docker, Apache, PHP-FPM y MySQL.

¿Te has encontrado alguna vez instalando Moodle manualmente en múltiples servidores? ¿Y si te dijera que puedes automatizar todo este proceso en minutos con una sola herramienta? Bienvenido al mundo de Ansible.

¿Necesitas una solución LMS personalizada o integrada con tus sistemas actuales?

Entornos de Formación #edTech Experts

En Entornos de Formación (www.edf.global) desarrollamos e integramos plataformas de aprendizaje a medida, adaptadas a las necesidades de tu organización. ¡No dudes en contactarnos para una consulta sin compromiso! Estamos aquí para ayudarte a crear el entorno de aprendizaje perfecto para tu equipo o institución.

Paso 1: Preparativos Iniciales
1.1 Configuración Básica

Antes de comenzar con la automatización de la instalación de Moodle, es crucial asegurarse de que todos los requisitos previos estén en su lugar. Aquí te detallo todo lo que necesitas para seguir este tutorial:

1.2. Instalación de Ansible

Ansible debe estar instalado en tu máquina local o en un servidor de control desde donde ejecutarás los playbooks. Si aún no lo tienes instalado, puedes hacerlo siguiendo estos pasos:

YAML
# Para Ubuntu - Debian
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

# Dependencia para gestionar bases de datos
$ sudo apt install -y python3-pymysql

# En CentOs/RHEL/Fedora
sudo yum install ansible

# Para Mac OS X ( Utilizando Homebrew ) 
$ brew install ansible

1.3. Acceso SSH a los Servidores Objetivo

Ansible utiliza SSH para comunicarse con los servidores remotos. Para garantizar una conexión sin problemas, sigue estos pasos:

  1. Genera una clave SSH en tu máquina local si no tienes una
Bash
ssh-keygen -t rsa -b 4096

Presiona Enter para aceptar la ubicación predeterminada y deja la frase de contraseña en blanco si deseas una autenticación sin contraseña.

2. Copia la clave pública a los servidores objetivo o bien inyéctala en el fichero ~/.ssh/authorized_keys

Bash
ssh-copy-id usuario@servidor

# O bien copiar el contenido del fichero público.
cat ~/.ssh/id_ed25519.pub  # o como se llame tu fichero de clave pública

ssh-ed25519 AAAAC3NzaC1lZAGI1NTE5AAAAIAcwADAQ2qsXZDBYNV6hJabmfiVfsSfEVzRdakwmjRT4 andreu@MacBook-Pro-de-Andres.local

# Pégalo en el fichero de claves SSH autorizadas
vim ~/.ssh/authorized_keys

Reemplaza usuario con el nombre de usuario y servidor con la dirección IP o el nombre del host del servidor.

3. Verifica la conexión ssh

Bash
ssh usuario@servidor

Si puedes conectarte sin introducir una contraseña de usuario o sólo introduciendo la contraseña que le hayas dado a tu clave privada, estás listo para utilizar Ansible.

1.4 Inventario de Ansible

El inventario de Ansible es un fichero que define los servidores donde se ejecutarán los playbooks. Puedes organizar los servidores en grupos para facilitar la gestión.

Ejemplo de un fichero de inventario (inventory.ini):

INI
[webservers]
server1 ansible_host=192.168.1.10
server2 ansible_host=192.168.1.11

[webservers:vars]
ansible_user=root
ansible_ssh_private_key_file=/home/user/.ssh/id_ed25519
  • Grupos: Los servidores se agrupan bajo [webservers]. Puedes crear múltiples grupos para diferentes propósitos (por ejemplo, [dbservers] para servidores de bases de datos).
  • Variables: Las variables específicas del grupo se definen bajo [webservers:vars]. Aquí, especificamos el usuario y la clave privada SSH.

Paso 2: Desplegar Moodle con Ansible

El playbook es el corazón de Ansible, un fichero YAML que define las tareas específicas que se ejecutarán en el servidor para configurar y desplegar Moodle. A continuación, te presento un ejemplo detallado de cómo crear un playbook que instala Moodle en un servidor Ubuntu, utilizando las tecnologías más adecuadas para garantizar un rendimiento óptimo.

En este caso, asumiremos que deseamos instalar la versión 4.5.2 de Moodle (disponible en la rama MOODLE_405_STABLE ) en una máquina con Ubuntu 24.04 , utilizando PHP-FPM 8.3 como procesador de scripts PHP, MariaDB como sistema de gestión de bases de datos y Apache2 como servidor web. Además, integraremos herramientas adicionales como Redis para caché y sesiones, y Let’s Encrypt para obtener certificados SSL gratuitos y asegurar las conexiones del sitio.

Este playbook no solo automatiza la instalación de Moodle, sino que también configura todos los componentes necesarios para que funcione de manera segura y eficiente, desde la base de datos hasta el servidor web y las configuraciones de rendimiento.

Arquitectura del Sistema a Desplegar

La arquitectura del sistema Moodle implementado mediante Ansible está diseñada para garantizar un despliegue rápido, seguro y escalable. La solución se basa en una combinación de tecnologías clave que trabajan juntas para proporcionar un entorno óptimo para la plataforma LMS (Learning Management System).

En este sistema, Apache2 actúa como servidor web principal, manejando las solicitudes HTTP/HTTPS y sirviendo los recursos estáticos. Por su parte, PHP-FPM procesa los scripts PHP necesarios para el funcionamiento de Moodle, asegurando un rendimiento eficiente incluso bajo cargas altas. La base de datos relacional MariaDB almacena toda la información crítica relacionada con cursos, usuarios y configuraciones, mientras que Redis se utiliza como servidor de caché para mejorar la velocidad de respuesta y gestionar sesiones de usuario.

Además, se implementa Let’s Encrypt para obtener certificados SSL gratuitos, asegurando conexiones seguras entre el cliente y el servidor. El directorio de datos de Moodle (/var/www/moodledata) se configura con permisos estrictos para proteger la información sensible de los usuarios.

Esta arquitectura no solo facilita la instalación inicial de Moodle, sino que también permite futuras mejoras, como la integración de balanceadores de carga o la replicación de bases de datos, lo que garantiza alta disponibilidad y escalabilidad en entornos empresariales.

Diagrama de arquitectura del despliegue

Playbook de Ansible paso a paso

A continuación, te explico paso a paso el contenido del playbook de Ansible para instalar Moodle en un servidor Ubuntu. Este playbook está diseñado para automatizar completamente la instalación y configuración de Moodle, incluyendo las dependencias necesarias como Apache, PHP-FPM, MariaDB, Redis y Certbot para SSL.

Vamos a crear un fichero llamado playbook.yml con el siguiente YAML:

YAML
---
- name: Configurar servidor Ubuntu con Moodle y SSL para PHP-FPM
  hosts: localhost
  become: yes
  vars:
    moodle_git_repo: "https://github.com/moodle/moodle.git"
    moodle_dir: "/var/www/moodle"
    moodle_data_dir: "/var/www/moodledata"
    moodle_url: "https://moodle.miempresa.com"
    moodle_dns: "moodle.miempresa.com"
    db_name: "moodleDbName"
    db_user: "moodleDbUser"
    db_password: "D3HXRbPLBA9TyT5R81_"
    db_root_password: "Ly9p6XuDTRvxr"
    db_host: "localhost"
    php_version: "8.3"

  tasks:
    - name: Actualizar paquetes
      apt:
        update_cache: yes
        upgrade: yes

    - name: Agregar repositorio de Ondrej Sury para PHP
      apt_repository:
        repo: "ppa:ondrej/php"
        state: present

    - name: Instalar dependencias
      apt:
        name:
          - apache2
          - php{{ php_version }}-fpm
          - php{{ php_version }}-cli
          - php{{ php_version }}-mysql
          - php{{ php_version }}-xml
          - php{{ php_version }}-mbstring
          - php{{ php_version }}-curl
          - php{{ php_version }}-zip
          - php{{ php_version }}-gd
          - php{{ php_version }}-intl
          - php{{ php_version }}-soap
          - php{{ php_version }}-bcmath
          - php{{ php_version }}-redis
          - mariadb-server
          - mariadb-client
          - redis
          - git
          - certbot
          - python3-certbot-apache
        state: present

    - name: Ensure PHP-FPM is running and enabled
      systemd:
        name: php{{ php_version }}-fpm
        state: started
        enabled: yes

    - name: Crear directorio de datos para Moodle
      file:
        path: "{{ moodle_data_dir }}"
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

    - name: Configurar el directorio de Moodle como seguro en Git
      command: git config --global --add safe.directory {{ moodle_dir }}
      become: yes
      tags: git-safe-directory

    - name: Clonar Moodle desde Git
      git:
        repo: "{{ moodle_git_repo }}"
        dest: "{{ moodle_dir }}"
        version: "MOODLE_405_STABLE"
        force: yes
      tags: clone-moodle

    - name: Configurar permisos de escritura para Moodle
      file:
        path: "{{ moodle_dir }}"
        owner: www-data
        group: www-data
        recurse: yes

    - name: Cambiar el método de autenticación de root en MariaDB a mysql_native_password
      command: >
        mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{{ db_root_password }}'); FLUSH PRIVILEGES;"

    - name: Crear base de datos para Moodle
      mysql_db:
        name: "{{ db_name }}"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"

    - name: Crear usuario Moodle en MariaDB
      mysql_user:
        name: "{{ db_user }}"
        password: "{{ db_password }}"
        priv: "{{ db_name }}.*:ALL"
        host: "localhost"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"

    - name: Configurar VirtualHost para Moodle con SSL y PHP-FPM
      copy:
        dest: "/etc/apache2/sites-available/moodle.conf"
        content: |
          <VirtualHost *:80>
              ServerName {{ moodle_dns }}
              DocumentRoot {{ moodle_dir }}

              <Directory {{ moodle_dir }}>
                  AllowOverride All
                  Require all granted
              </Directory>

              # Enable PHP-FPM
              <FilesMatch \.php$>
                  SetHandler "proxy:unix:/run/php/php{{ php_version }}-fpm.sock|fcgi://localhost"
              </FilesMatch>

              ErrorLog ${APACHE_LOG_DIR}/moodle_error.log
              CustomLog ${APACHE_LOG_DIR}/moodle_access.log combined
          </VirtualHost>
      notify: Restart Apache

    - name: Habilitar módulos necesarios
      shell: |
        a2enmod ssl
        a2enmod rewrite
        a2enmod proxy_fcgi
        a2enmod setenvif
      notify: Restart Apache

    - name: Habilitar VirtualHost y deshabilitar el predeterminado
      shell: |
        a2ensite moodle.conf  # Fixed name
        a2dissite 000-default.conf
      notify: Restart Apache

    - name: Configurar fichero config.php de Moodle
      template:
        src: templates/config.php.j2
        dest: "{{ moodle_dir }}/config.php"
        owner: www-data
        group: www-data
        mode: '0644'
      notify: Restart PHP-FPM

    - name: Reiniciar servicios
      systemd:
        name: "{{ item }}"
        state: restarted
      loop:
        - mysql
        - redis

  handlers:
    - name: Restart Apache
      service:
        name: apache2
        state: restarted

    - name: Restart PHP-FPM
      service:
        name: php{{ php_version }}-fpm
        state: restarted

A continuación desgranaremos paso a paso qué hace cada uno de los bloques de este fichero Ansible.

1. Actualizar paquetes del sistema

YAML
- name: Actualizar paquetes
  apt:
    update_cache: yes
    upgrade: yes

¿Qué hace?
Este paso actualiza la lista de paquetes disponibles en el servidor y luego actualiza todos los paquetes instalados a sus versiones más recientes. Es una buena práctica asegurarse de que el sistema esté actualizado antes de instalar cualquier software nuevo.

2. Agregar repositorio de Ondrej Sury para PHP

YAML
- name: Agregar repositorio de Ondrej Sury para PHP
  apt_repository:
    repo: "ppa:ondrej/php"
    state: present

¿Qué hace?
Este paso agrega el repositorio de Ondrej Sury, que contiene versiones actualizadas de PHP. Esto es necesario porque los repositorios oficiales de Ubuntu no siempre tienen las versiones más recientes de PHP, y Moodle requiere una versión específica (en este caso, PHP 8.3).

3. Instalar dependencias

YAML
- name: Instalar dependencias
  apt:
    name:
      - apache2
      - php{{ php_version }}-fpm
      - php{{ php_version }}-cli
      - php{{ php_version }}-mysql
      - php{{ php_version }}-xml
      - php{{ php_version }}-mbstring
      - php{{ php_version }}-curl
      - php{{ php_version }}-zip
      - php{{ php_version }}-gd
      - php{{ php_version }}-intl
      - php{{ php_version }}-soap
      - php{{ php_version }}-bcmath
      - php{{ php_version }}-redis
      - mariadb-server
      - mariadb-client
      - redis
      - git
      - certbot
      - python3-certbot-apache
    state: present

¿Qué hace?
Este paso instala todas las dependencias necesarias para Moodle, incluyendo:

  • Certbot y python3-certbot-apache: Para obtener y configurar un certificado SSL gratuito de Let’s Encrypt.
  • Apache2: El servidor web que alojará Moodle.
  • PHP 8.3 y sus extensiones: Moodle requiere varias extensiones de PHP para funcionar correctamente, como php-mysql para conectarse a la base de datos, php-xml para manejar ficheros XML, php-mbstring para manejar cadenas de caracteres multibyte, etc.
  • MariaDB: El sistema de gestión de bases de datos que Moodle utilizará para almacenar datos.
  • Redis: Un servidor de caché que puede mejorar el rendimiento de Moodle.
  • Git: Para clonar el repositorio de Moodle.

4. Asegurar que PHP-FPM esté en ejecución y habilitado

YAML
- name: Ensure PHP-FPM is running and enabled
  systemd:
    name: php{{ php_version }}-fpm
    state: started
    enabled: yes

¿Qué hace?
PHP-FPM (FastCGI Process Manager) es un manejador de procesos para PHP que mejora el rendimiento de las aplicaciones web. Este paso asegura que el servicio PHP-FPM esté en ejecución y que se inicie automáticamente al arrancar el sistema.

5. Crear directorio de datos para Moodle

YAML
- name: Crear directorio de datos para Moodle
  file:
    path: "{{ moodle_data_dir }}"
    state: directory
    owner: www-data
    group: www-data
    mode: '0755'

¿Qué hace?
Moodle necesita un directorio para almacenar ficheros de datos, como ficheros subidos por los usuarios, caché, etc. Este paso crea ese directorio (/var/www/moodledata) y le asigna los permisos adecuados, con el usuario y grupo www-data (el usuario bajo el cual se ejecuta Apache).

6. Configurar el directorio de Moodle como seguro en Git

YAML
- name: Configurar el directorio de Moodle como seguro en Git
  command: git config --global --add safe.directory {{ moodle_dir }}
  become: yes
  tags: git-safe-directory

¿Qué hace?
Le indica a Git que el directorio de Moodle es de un propietario seguro y que confíe en él.
Esto pasa porque el usuario que ejecuta el Playbook y ejecuta por tanto la clonación del repositorio de Git, es habitualmente diferente al usuario propietario del directorio, www-data .

Parámetros:

  • command: Ejecuta el comando git config --global --add safe.directory {{ moodle_dir }} para agregar el directorio como seguro en la configuración global de Git.
  • become: yes: Ejecuta el comando con privilegios de superusuario (sudo), ya que es necesario para modificar la configuración global de Git.
  • tags: git-safe-directory: Agrega una etiqueta opcional para organizar las tareas. Puedes usar esta etiqueta para ejecutar solo esta tarea si lo deseas (por ejemplo, ansible-playbook playbook.yml --tags git-safe-directory).

7. Clonar Moodle desde Git

YAML
- name: Clonar Moodle desde Git
  git:
    repo: "{{ moodle_git_repo }}"
    dest: "{{ moodle_dir }}"
    version: "MOODLE_405_STABLE"
    force: yes

¿Qué hace?
Este paso clona el repositorio oficial de Moodle desde GitHub en el directorio especificado (/var/www/moodle). La versión clonada es la rama MOODLE_405_STABLE, que es una versión estable de Moodle. El parámetro force: yes asegura que cualquier contenido existente en el directorio sea sobrescrito.

8. Configurar permisos de escritura para Moodle

YAML
- name: Configurar permisos de escritura para Moodle
  file:
    path: "{{ moodle_dir }}"
    owner: www-data
    group: www-data
    recurse: yes

¿Qué hace?
Este paso asegura que el usuario y grupo www-data sean los propietarios del directorio de Moodle y todos sus ficheros. Esto es necesario para que Apache pueda leer y escribir en los ficheros de Moodle.

9. Cambiar el método de autenticación del usuario root en MariaDB

YAML
- name: Cambiar el método de autenticación de root en MariaDB a mysql_native_password
      command: >
        mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{{ db_root_password }}'); FLUSH PRIVILEGES;"

¿Qué hace?
Por defecto, en algunas versiones de MariaDB y MySQL, el usuario root está configurado para autenticarse mediante auth_socket, lo que impide el acceso con contraseña desde herramientas como mysql o scripts automatizados.

Este paso cambia el método de autenticación del usuario root a mysql_native_password, permitiendo que pueda autenticarse con la contraseña definida en db_root_password. Además, se ejecuta FLUSH PRIVILEGES para aplicar los cambios inmediatamente.

De esta forma, el usuario root podrá gestionar bases de datos y usuarios correctamente dentro del playbook de Ansible. 🚀

10. Crear la base de datos para Moodle

YAML
- name: Crear base de datos para Moodle
  mysql_db:
    name: "{{ db_name }}"
    state: present
    login_user: root
    login_password: "{{ db_root_password }}"

¿Qué hace?
Este paso crea una base de datos en MariaDB llamada moodleDbName, que será utilizada por Moodle para almacenar toda la información relacionada con cursos, usuarios, etc.

11. Crear el usuario de Moodle en MariaDB

YAML
- name: Crear usuario Moodle en MariaDB
  mysql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    priv: "{{ db_name }}.*:ALL"
    host: "localhost"
    state: present
    login_user: root
    login_password: "{{ db_root_password }}"

¿Qué hace?
Este paso crea un usuario en MariaDB (moodleDbUser) y le otorga todos los privilegios sobre la base de datos moodleDbName. Este usuario será utilizado por Moodle para conectarse a la base de datos.

12. Configurar VirtualHost para Moodle con SSL y PHP-FPM

YAML
- name: Configurar VirtualHost para Moodle con SSL y PHP-FPM
  copy:
    dest: "/etc/apache2/sites-available/moodle.conf"
    content: |
      <VirtualHost *:80>
          ServerName {{ moodle_dns }}
          DocumentRoot {{ moodle_dir }}

          <Directory {{ moodle_dir }}>
              AllowOverride All
              Require all granted
          </Directory>

          # Enable PHP-FPM
          <FilesMatch \.php$>
              SetHandler "proxy:unix:/run/php/php{{ php_version }}-fpm.sock|fcgi://localhost"
          </FilesMatch>

          ErrorLog ${APACHE_LOG_DIR}/moodle_error.log
          CustomLog ${APACHE_LOG_DIR}/moodle_access.log combined
      </VirtualHost>
  notify: Restart Apache

¿Qué hace?
Este paso configura un VirtualHost en Apache para Moodle. El VirtualHost escucha en el puerto 80 y está configurado para usar PHP-FPM para procesar ficheros PHP. También se especifica el directorio raíz del sitio (/var/www/moodle) y se habilitan las reglas de reescritura (AllowOverride All).

13. Habilitar módulos necesarios en Apache

YAML
- name: Habilitar módulos necesarios
  shell: |
    a2enmod ssl
    a2enmod rewrite
    a2enmod proxy_fcgi
    a2enmod setenvif
  notify: Restart Apache

¿Qué hace?
Este paso habilita varios módulos de Apache necesarios para Moodle:

  • setenvif: Para establecer variables de entorno basadas en condiciones.
  • ssl: Para soportar conexiones HTTPS.
  • rewrite: Para permitir la reescritura de URLs (necesario para Moodle).
  • proxy_fcgi: Para integrar PHP-FPM con Apache.

14. Habilitar VirtualHost y deshabilitar el predeterminado

YAML
- name: Habilitar VirtualHost y deshabilitar el predeterminado
  shell: |
    a2ensite moodle.conf  # Fixed name
    a2dissite 000-default.conf
  notify: Restart Apache

¿Qué hace?
Este paso habilita el VirtualHost que acabamos de crear (moodle.conf) y deshabilita el VirtualHost predeterminado de Apache (000-default.conf).

15. Obtener certificado SSL con Let’s Encrypt

YAML
- name: Obtener certificado SSL con Let's Encrypt
  command: certbot --apache --non-interactive --agree-tos -m mi@empresa.com -d {{ moodle_dns }}
  notify: Restart Apache

¿Qué hace?
Este paso utiliza Certbot para obtener un certificado SSL gratuito de Let’s Encrypt para el dominio moodle.miempresa.com. El certificado se configura automáticamente en Apache.

16. Configurar fichero config.php de Moodle

YAML
- name: Configurar fichero config.php de Moodle
  template:
    src: templates/config.php.j2
    dest: "{{ moodle_dir }}/config.php"
    owner: www-data
    group: www-data
    mode: '0644'
  notify: Restart PHP-FPM

¿Qué hace?
Este paso utiliza una plantilla J2 (Jinja2) para generar el fichero config.php de Moodle, que contiene la configuración de la base de datos, la URL del sitio, y otras configuraciones importantes.

17. Modificar PHP.ini

YAML
- name: Modificar php.ini para ajustar configuraciones de PHP
  lineinfile:
    path: "/etc/php/{{ php_version }}/fpm/php.ini"
    regexp: "^{{ item.key }}"
    line: "{{ item.key }} = {{ item.value }}"
    state: present
  loop:
    - { key: "memory_limit", value: "1024M" }
    - { key: "max_input_vars", value: "9999" }
    - { key: "max_execution_time", value: "600" }
    - { key: "upload_max_filesize", value: "512M" }
    - { key: "post_max_size", value: "256M" }
  notify: Restart PHP-FPM

¿Qué hace?
Este paso modifica el fichero php.ini, que es el fichero de configuración principal de PHP. Ajusta los siguientes parámetros:

  • memory_limit: Establece el límite de memoria que un script de PHP puede consumir. En este caso, se configura a 1024M (1024 MB).
  • max_input_vars: Define el número máximo de variables de entrada que PHP puede aceptar. Se configura a 9999 para manejar formularios grandes.
  • max_execution_time: Establece el tiempo máximo (en segundos) que un script de PHP puede ejecutarse antes de ser terminado. Se configura a 600 segundos (10 minutos).
  • upload_max_filesize: Define el tamaño máximo de ficheros que se pueden subir a través de formularios. Se configura a 512M (512 MB).
  • post_max_size: Establece el tamaño máximo de datos que se pueden enviar mediante el método POST. Se configura a 256M (256 MB).

¿Cómo funciona?

lineinfile: Este módulo de Ansible busca una línea en un fichero que coincida con una expresión regular (regexp) y la reemplaza con el contenido especificado en line. Si la línea no existe, la agrega al fichero.

  • path: Especifica la ruta del fichero php.ini que se va a modificar. En este caso, se usa la ruta /etc/php/{{ php_version }}/fpm/php.ini, donde {{ php_version }} es la variable que define la versión de PHP (en este caso, 8.3).
  • regexp: Busca una línea que comience con el nombre del parámetro (por ejemplo, memory_limit).
  • line: Define la nueva línea que se escribirá en el fichero. Por ejemplo, memory_limit = 1024M.
  • loop: Permite iterar sobre una lista de parámetros y valores para modificarlos uno por uno.
  • notify: Restart PHP-FPM: Notifica al handler para reiniciar el servicio PHP-FPM después de realizar los cambios.

¿Por qué es importante?
Estos ajustes son cruciales para garantizar que Moodle funcione correctamente, especialmente en entornos donde se manejan grandes cantidades de datos, como ficheros de cursos, formularios complejos, o procesos que requieren más tiempo de ejecución. Sin estos ajustes, podrías encontrarte con errores como:

Límite de memoria excedido: Si memory_limit es demasiado bajo, los scripts de PHP pueden fallar.

Tiempo de ejecución excedido: Si max_execution_time es demasiado bajo, los procesos largos (como la generación de informes) pueden ser interrumpidos.

Ficheros demasiado grandes: Si upload_max_filesize o post_max_size son demasiado pequeños, los usuarios no podrán subir ficheros grandes.

18. Reiniciar servicios

YAML
- name: Reiniciar servicios
  systemd:
    name: "{{ item }}"
    state: restarted
  loop:
    - mysql
    - redis

¿Qué hace?
Este paso reinicia los servicios de MariaDB (mysql) y Redis para asegurarse de que todas las configuraciones aplicadas estén activas.

19. Handlers: Reiniciar Apache y PHP-FPM

YAML
handlers:
  - name: Restart Apache
    service:
      name: apache2
      state: restarted

  - name: Restart PHP-FPM
    service:
      name: php{{ php_version }}-fpm
      state: restarted

¿Qué hace?
Los handlers son tareas que se ejecutan solo cuando son notificadas por otras tareas. En este caso, si alguna tarea requiere que Apache o PHP-FPM sean reiniciados, estos handlers se encargan de hacerlo.

Configuración avanzada de seguridad

Cuando automatizamos procesos críticos como la instalación de Moodle, es fundamental tener en cuenta las consideraciones de seguridad para proteger tanto los datos como las configuraciones sensibles. Aquí te detallo algunas prácticas recomendadas:

Uso de ansible-vault para Variables Sensibles

Almacenar contraseñas, claves API u otros datos sensibles en texto plano dentro de tus playbooks puede exponer tu sistema a riesgos innecesarios. Para evitar esto, utiliza ansible-vault, una herramienta que permite cifrar ficheros y variables.

YAML
vars:
  db_password: "{{ lookup('ansible_vault', 'db_password') }}"
  db_root_password: "{{ lookup('ansible_vault', 'db_root_password') }}"

Procedimiento:

  1. Crea un fichero cifrado con ansible-vault:
Bash
ansible-vault create secrets.yml

2. Almacena tus variables sensibles en este fichero

YAML
db_password: "D3HXRbPLBA9TyT5R81_"
db_root_password: "Ly9p6XuDTRvxr"

3. Utiliza estas variables en tu playbook mediante lookup

Habilitar HTTPS con Let’s Encrypt

Asegúrate de que todas las conexiones sean seguras utilizando certificados SSL/TLS. Este paso ya está incluido en el playbook, pero merece una mención especial:

Bash
- name: Obtener certificado SSL con Let's Encrypt
  command: certbot --apache --non-interactive --agree-tos -m admin@miempresa.com -d {{ moodle_dns }}
  notify: Restart Apache

Consideraciones de seguridad:

  • Redirige HTTP a HTTPS: Modifica el VirtualHost para forzar todas las conexiones a utilizar HTTPS.
  • Renueva automáticamente los certificados: Let’s Encrypt emite certificados válidos por 90 días. Configura un cronjob para renovarlos automáticamente.

Proteger la base de datos

Configura reglas de firewall para restringir el acceso a MariaDB solo desde el servidor web.

Bash
- name: Configurar firewall para MariaDB
  ufw:
    rule: allow
    proto: tcp
    port: 3306
    from_ip: 127.0.0.1
  notify: Restart Firewall

Consideraciones de seguridad:

  • No expongas puertos públicos: Evita que la base de datos sea accesible desde Internet.
  • Usa contraseñas fuertes: Genera contraseñas aleatorias y complejas para usuarios de la base de datos.

    Uso de An

Paso 3: Crear el fichero de configuración config.php.j2 de Moodle

El fichero config.php es el corazón de la configuración de Moodle. Este fichero contiene todas las configuraciones esenciales que permiten a Moodle conectarse a la base de datos, definir la URL del sitio, gestionar ficheros, y establecer parámetros clave para el funcionamiento del sistema. Sin este fichero, Moodle no podría operar correctamente, ya que es el punto de partida para que la plataforma sepa cómo interactuar con el servidor, la base de datos, y otros componentes externos.

En un entorno de producción, es crucial que este fichero esté correctamente configurado y protegido, ya que contiene información sensible como credenciales de la base de datos y configuraciones de seguridad. Además, en entornos donde se requiere alta disponibilidad y rendimiento, el config.php puede incluir configuraciones avanzadas para la gestión de caché, sesiones, y optimización del servidor.

En este ejemplo, el fichero config.php se genera automáticamente utilizando una plantilla Jinja2 en un playbook de Ansible. Esto no solo simplifica el proceso de configuración, sino que también asegura que todas las instalaciones de Moodle tengan configuraciones consistentes y estén listas para funcionar en cuestión de minutos.

A continuación, se detallan las configuraciones más importantes incluidas en este fichero, que permiten a Moodle integrarse con una base de datos MariaDB, utilizar Redis para la gestión de sesiones y caché, y optimizar el rendimiento para entornos con alta carga de usuarios.

Crearemos este fichero con nombre config.php.j2 y lo ubicaremos dentro del directorio templates .

PHP
<?php  // Moodle configuration file

unset($CFG);
global $CFG;
$CFG = new stdClass();

$CFG->dbtype    = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost    = '{{ db_host }}';
$CFG->dbname    = '{{ db_name }}';
$CFG->dbuser    = '{{ db_user }}';
$CFG->dbpass    = '{{ db_password }}';
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array(
  'dbpersist' => 0,
  'dbport' => '',
  'dbsocket' => '',
  'dbcollation' => 'utf8mb4_unicode_ci',
);

$CFG->wwwroot   = '{{ moodle_url }}';
$CFG->dataroot  = '{{ moodle_data_dir }}';
$CFG->admin     = 'admin';

$CFG->directorypermissions = 0777;

$CFG->sslproxy = true;  // Si estás usando un proxy SSL
$CFG->cachejs = true;   // Habilitar caché de JavaScript para mejorar el rendimiento


// Configuración de sesiones (opcional)
$CFG->session_handler_class = '\core\session\redis';
$CFG->session_redis_host = '127.0.0.1';
$CFG->session_redis_port = 6379;
$CFG->session_redis_database = 0;
$CFG->session_redis_prefix = 'moodle_session_';

// Configuración de caché (opcional, pero recomendado para mejorar el rendimiento)
$CFG->cachestores = array(
    'redis' => array(
        'name' => 'redis',
        'plugin' => 'redis',
        'configuration' => array(
            'server' => '127.0.0.1:6379',
            'prefix' => 'moodle_',
        ),
    ),
);
$CFG->cachetype = 'redis';

// Configuración de depuración (solo para desarrollo)
$CFG->debug = (E_ALL | E_STRICT);
$CFG->debugdisplay = 1;

// Otras configuraciones
$CFG->lang = 'es';  // Idioma predeterminado
$CFG->timezone = 'Europe/Madrid';  // Zona horaria

require_once(__DIR__ . '/lib/setup.php');

Explicación de las configuraciones

  1. Configuración de la base de datos:
    • dbtype: Tipo de base de datos (mariadb en este caso).
    • dbhost: Host de la base de datos (localhost).
    • dbname: Nombre de la base de datos (moodleDbName).
    • dbuser: Usuario de la base de datos (moodleDbUser).
    • dbpass: Contraseña de la base de datos (D3HXRbPLBA9TyT5R81_).
    • prefix: Prefijo para las tablas de Moodle (mdl_ es el predeterminado).
  2. Configuración del sitio:
    • wwwroot: URL del sitio Moodle (https://moodle.miempresa.com).
    • dataroot: Directorio de datos de Moodle (/var/www/moodledata).
    • admin: Nombre del usuario administrador predeterminado (admin).
  3. Configuración de sesiones (opcional):
    • session_handler_class: Usa Redis para manejar las sesiones, lo que mejora el rendimiento en entornos con alta carga.
  4. Configuración de caché (opcional):
    • cachestores: Configura Redis como almacén de caché.
    • cachetype: Usa Redis como tipo de caché predeterminado.
  5. Configuración de depuración (solo para desarrollo):
    • debug: Habilita la depuración para mostrar todos los errores.
    • debugdisplay: Muestra los errores en pantalla (solo para desarrollo).
  6. Otras configuraciones:
    • lang: Idioma predeterminado (es para español).
    • timezone: Zona horaria del servidor (Europe/Madrid).

Paso 4: Ejecutar el Playbook

Una vez que has preparado tu entorno y has revisado el playbook, es momento de ejecutarlo. Este paso es crucial, ya que es donde Ansible toma el control y comienza a realizar todas las tareas definidas en el playbook para instalar y configurar Moodle en tu servidor local (localhost).

4.1 Ejecución del Playbook

Ejecutar el playbook en localhost es ideal para entornos de desarrollo, pruebas, o cuando estás trabajando directamente en el servidor donde deseas desplegar Moodle. Ansible se conectará a localhost (tu propia máquina) y ejecutará cada tarea de manera secuencial, asegurándose de que todo esté configurado correctamente.

A continuación, te explico cómo ejecutar el playbook en localhost y qué esperar durante el proceso, ¡así que vamos a nuestra terminal favorita!

Bash
ansible-playbook --ask-become-pass -i localhost playbook.yml 

Tras ejecutar este comando, nos pedirá el password de Root y comenzará a ejecutar tareas paso a paso. Para cada paso nos aparecerá información en diferentes colores ( rojo fallo, amarillo para warnings o avisos, verde para OK, rosa para warnings ).

Despliegue ansible con errores

Vovlemos a ejecutarlo

Despliegue ansible con éxito

4.2 Verificación del Sistema

Una vez que el playbook haya finalizado su ejecución sin errores, es fundamental verificar que todos los componentes del sistema estén funcionando correctamente. Esta etapa garantiza que Moodle esté listo para ser instalado y que no existan problemas ocultos que puedan afectar su rendimiento o seguridad.

Pasos de Verificación
Abre tu navegador web preferido y navega a la dirección configurada para Moodle, por ejemplo:

Acceso al Sitio Web

Asegúrate de que puedes acceder al sitio sin problemas y que se muestra la interfaz de instalación o inicio de sesión de Moodle. Si ves algún error en la pantalla, revisa los siguientes puntos.

Bash
https://moodle.miempresa.com/install.php

Verificación del Estado de Servicios

Antes de continuar, asegúrate de que todos los servicios críticos están activos y funcionando correctamente. Ejecuta los siguientes comandos en tu terminal:

Bash
sudo systemctl status apache2
sudo systemctl status php8.3-fpm
sudo systemctl status mariadb
sudo systemctl status redis-server

Cada uno de estos comandos debería mostrar un estado activo (running) . Si alguno de ellos está inactivo, reinicia el servicio correspondiente utilizando sudo systemctl restart <nombre_del_servicio>.

Revisión de Logs

Los logs son una herramienta invaluable para identificar posibles problemas. Revisa los registros de Apache y PHP-FPM en busca de errores o advertencias:

Bash
# Logs de Apache
sudo tail -f /var/log/apache2/error.log

# Logs de PHP-FPM
sudo tail -f /var/log/php{{ php_version }}-fpm.log

Si encuentras mensajes de error, investiga las causas específicas y corrige los problemas antes de proceder.

Pruebas de Base de Datos

Verifica que la conexión a MariaDB esté funcionando correctamente. Puedes hacerlo iniciando sesión en la base de datos con el usuario root:

Bash
mysql -u root -p

Una vez dentro, comprueba que la base de datos de Moodle existe y contiene tablas:

Bash
SHOW DATABASES;
USE moodleDbName;
SHOW TABLES;

Comprobación Final

  • Después de completar los pasos anteriores, realiza una prueba final navegando nuevamente al sitio Moodle en tu navegador. Intenta iniciar sesión y realizar algunas acciones básicas, como crear un curso o agregar usuarios.
  • Si todo funciona según lo esperado, ¡felicitaciones! Has automatizado exitosamente la instalación de Moodle con Ansible.

Conclusión

La automatización mediante herramientas como Ansible no solo simplifica procesos complejos, sino que también redefine cómo abordamos la gestión de infraestructuras en entornos modernos. Al automatizar la instalación de Moodle, hemos demostrado cómo una tarea que podría llevar horas o incluso días se puede reducir a cuestión de minutos , garantizando al mismo tiempo consistencia y reproducibilidad en cada despliegue.

Pero los beneficios de Ansible van mucho más allá del ahorro de tiempo. Al estructurar nuestra infraestructura mediante playbooks, obtenemos un sistema escalable que puede adaptarse fácilmente a las necesidades futuras. Ya sea que estés gestionando un único servidor o una red de servidores distribuidos, Ansible te permite replicar configuraciones con precisión, minimizando el riesgo de errores humanos y asegurando un funcionamiento óptimo.

Además, el enfoque declarativo de Ansible facilita el mantenimiento futuro . Cada playbook es una documentación viva de tu infraestructura, permitiendo que nuevos miembros del equipo comprendan rápidamente cómo funciona el sistema. Esto fomenta la colaboración y mejora la capacidad de respuesta ante cambios o actualizaciones necesarias.

Sin embargo, si necesitas una solución más robusta, personalizada o integrada con otras herramientas, en Entornos de Formación (www.edf.global ) estamos especializados en el desarrollo e integración de soluciones LMS a medida . Ya sea que necesites una plataforma educativa completamente personalizada, integraciones con sistemas existentes, o soporte técnico avanzado, nuestro equipo de expertos está listo para ayudarte. No dudes en contactarnos para una consulta sin compromiso.

¡Estamos aquí para convertir tus ideas en realidad!

Entornos de Formación edTech

En resumen, Ansible no solo es una herramienta técnica, sino un catalizador para la transformación digital . Con ella, puedes centrarte en lo que realmente importa: optimizar recursos, mejorar la experiencia del usuario y llevar tus proyectos al siguiente nivel. Ya sea que estés trabajando en un proyecto educativo como Moodle o en cualquier otro sistema crítico, Ansible te brinda la confianza y la flexibilidad necesarias para enfrentar los desafíos actuales y futuros con éxito.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *