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?

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.
Tabla de contenidos
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:
# 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:
- Genera una clave SSH en tu máquina local si no tienes una
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
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
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
):
[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.

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:
---
- 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
- 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
- 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
- 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
- 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
- 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
- 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 comandogit 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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 ficherophp.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
- 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
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.
vars:
db_password: "{{ lookup('ansible_vault', 'db_password') }}"
db_root_password: "{{ lookup('ansible_vault', 'db_root_password') }}"
Procedimiento:
- Crea un fichero cifrado con
ansible-vault
:
ansible-vault create secrets.yml
2. Almacena tus variables sensibles en este fichero
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:
- 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.
- 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 // 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
- 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).
- 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
).
- Configuración de sesiones (opcional):
session_handler_class
: Usa Redis para manejar las sesiones, lo que mejora el rendimiento en entornos con alta carga.
- Configuración de caché (opcional):
cachestores
: Configura Redis como almacén de caché.cachetype
: Usa Redis como tipo de caché predeterminado.
- 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).
- 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!
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 ).

Vovlemos a ejecutarlo

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.
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:
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:
# 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:
mysql -u root -p
Una vez dentro, comprueba que la base de datos de Moodle existe y contiene tablas:
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!

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.