La automatización de servidores es un proceso seguro y confiable para administrar y monitorear servidores de una manera efectiva y tecnológicamente avanzada. A diferencia del estilo tradicional de administrar servidores en centros de datos controlados por un equipo dedicado de expertos, todos los servidores se administran mediante automatización. Como resultado, los errores humanos se minimizan.
Las herramientas de gestión de configuración como Ansible, Puppet, Terraform, por nombrar algunas, se utilizan normalmente para automatizar servidores. Estas herramientas configuran servidores mediante automatización estableciendo procedimientos estándar para nuevos servidores, al tiempo que eliminan posibles errores cuando se realiza manualmente.
Ansible es un proyecto robusto de código abierto. Es flexible, fácil de usar y tiene la arquitectura más simplificada. No se requieren conocimientos de programación para usar los playbooks de Ansible y no requiere instalar software en los nodos. Por encima de todo, está repleto de excelentes capacidades que le permiten escribir scripts y agilizar la automatización.
En esta guía, te guiaremos a través de los pasos para instalar y configurar LAMP en Ubuntu 20.04 con Ansible.
Requisitos previos
Para seguir este tutorial, necesitarás:
- Ubuntu instalado en tu sistema.
- Uno o más hosts de Ansible: Inicialmente se deben configurar uno o más hosts remotos de Ansible que ejecuten el último Ubuntu. Sigue el tutorial Automatización de la configuración del servidor usando Ansible y Ubuntu 20.04 para la configuración.
- Un nodo de control de Ansible: Una máquina Ubuntu con Ansible instalado, configurado y conectado a tus hosts de Ansible mediante claves SSH:
-
- El nodo de control debe tener un usuario con privilegios sudo y un cortafuegos activado.
- Si necesitas ayuda para configurar Ansible, consulta el tutorial sobre instalación y configuración de Ansible en Ubuntu 20.04.
¿Cuál es el propósito del Playbook de Ansible?
Este playbook de Ansible es una forma alternativa de ejecutar el procedimiento descrito en nuestra guía Configuración de la pila LAMP – Linux Apache MySQL PHP.
La ejecución del playbook de Ansible dará como resultado las siguientes acciones en tus hosts de Ansible:
-
Instalar aptitude, una alternativa al gestor de paquetes apt preferido por Ansible.
-
Instalar todos los paquetes LAMP necesarios.
-
Crear un nuevo VirtualHost de Apache y configurar una raíz de documento dedicada.
-
Poner en ON el nuevo VirtualHost.
-
Poner en OFF el sitio web predeterminado de Apache, es decir, establecer la variable disable_default en true.
-
Elegir una contraseña para el usuario root de MySQL.
-
Eliminar las cuentas anónimas de MySQL y la base de datos de prueba.
-
Configurar UFW para permitir el tráfico HTTP en el puerto configurado, donde el valor predeterminado es 80.
-
Configurar un script de prueba de PHP.
Después de que el playbook de Ansible termine de ejecutarse, verás un entorno web PHP ejecutándose sobre Apache según las configuraciones que hayamos establecido.
Utilización del Playbook de Ansible
Primero, obtén el playbook de LAMP y sus dependencias del repositorio do-community/ansible-playbooks. A continuación, clona el repositorio con el playbook de LAMP en una carpeta local dentro del Nodo de Control de Ansible.
Ejecuta el comando git pull para asegurarte de tener acceso al contenido correcto que vamos a utilizar en este tutorial:
|
1 2 |
cd ~/ansible-playbooks git pull |
Si estás utilizando el repositorio do-community/ansible-playbooks por primera vez, considera clonar el repositorio en tu carpeta de inicio:
|
1 2 3 |
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks |
Ve a la carpeta lamp_ubuntu2004 y verás la estructura:
|
1 2 3 4 5 6 7 8 |
lamp_ubuntu2004 ├── files │ ├── apache.conf.j2 │ └── info.php.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md |
Aquí hay una descripción general de lo que significan estos archivos:
-
files/info.php.j2: Este es un archivo de plantilla donde puedes configurar una página de prueba de PHP en la raíz del servidor web.
-
files/apache.conf.j2: Otro archivo de plantilla utilizado para configurar el VirtualHost de Apache.
-
vars/default.yml: Es un archivo de variables para personalizar la configuración del playbook.
-
playbook.yml: Este archivo contiene todo el contenido de las tareas a ejecutar en el/los servidor/es remoto/s.
-
readme.md: Un archivo de lectura que contiene la información sobre este playbook.
Personalicemos las configuraciones de MySQL y Apache realizando cambios en el archivo de variables del playbook. Navega al directorio lamp_ubuntu2004 y abre el archivo vars/default.yml utilizando el editor nano :
|
1 2 |
cd lamp_ubuntu2004 nano vars/default.yml |
Al abrir el archivo vars/default.yml, habrá una lista de variables que deben modificarse:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
Comprendamos cada una de las variables en detalle:
-
mysql_root_password: Almacena la contraseña para la cuenta root de MySQL.
-
app_user: Es un usuario remoto que no es root en el host de Ansible que actúa como propietario de los archivos de la aplicación.
-
http_host: Muestra tu nombre de dominio.
-
http_conf: Muestra el nombre del archivo de configuración creado dentro de Apache.
-
http_port: Es el puerto HTTP para este host virtual, y 80 es el predeterminado.
-
disable_default: Se utiliza para deshacer las opciones predeterminadas que vienen con Apache.
Luego, guarda y cierra el archivo vars/default.yml archivo.
Una vez realizada toda la configuración, estamos listos para ejecutar este playbook en los servidores. Por defecto, la mayoría de los servidores en los playbooks están configurados para ejecutarse en cada servidor de los inventarios. Utilicemos la bandera -l para afectar solo a un único servidor o a un subgrupo seleccionado que se vea afectado por el playbook. Alternativamente, podemos usar la bandera -u para obtener una vista detallada de qué servidor remoto se está conectando y ejecutando en los hosts remotos.
Ejecutemos el playbook en un servidor server1 y conectémoslo con un usuario como justin:
|
1 |
ansible-playbook playbook.yml -l server1 -u justin |
Obtendrás una salida similar a esta:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
Once ya veas que el playbook termina de ejecutarse, navega a tu navegador web y accede al host del servidor. No olvides adjuntar /info.php al final de la IP:
|
1 |
http://server_host_or_IP/info.php |
Al hacer clic en esta URL, verás una página como esta:
|
Advertencia: La página mostrada contiene información confidencial sobre su entorno PHP. Por lo tanto, se recomienda eliminar su información personal del servidor utilizando el siguiente comando: rm -f /var/www/info.php |
¿Qué hay en el Playbook?
A continuación, comprendamos el significado y la importancia de los archivos utilizados en el ansible-playbook contenido:
-
vars/default.yml
El default.yml archivo de variables contiene el nombre de dominio y la contraseña de la cuenta de MySQL root . Estos son los valores predeterminados utilizados en las tareas de ansible-playbook :
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
- files/apache.conf.j2
El archivo apache.conf.j2 es un archivo de plantilla Jinja 2 utilizado para configurar un nuevo VirtualHost de Apache. Las variables utilizadas dentro de esta plantilla deben definirse en el archivo de variables vars/default.yml :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<VirtualHost *:{{ http_port }}> ServerAdmin webmaster@localhost ServerName {{ http_host }} ServerAlias www.{{ http_host }} DocumentRoot /var/www/{{ http_host }} ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/{{ http_host }}> Options -Indexes </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> </VirtualHost> |
- files/info.php.j2
Al igual que el archivo files/apache.conf.j2, el archivo info.php.j2 también es una plantilla Jinja. Usamos este archivo para configurar un script PHP de prueba en la raíz del documento de un servidor LAMP recién configurado:
|
1 2 |
<?php phpinfo(); |
-
playbook.yml
El archivo playbook.yml es donde se definen todas las tareas de esta configuración. En este archivo, se configuran todos los entornos LAMP. Comienza definiendo el grupo de servidores de destino y se establece en all. Además, toma el valor become como true ( become: true), y define todas las tareas que deben ejecutarse. A continuación, el archivo yaml tiene el archivo predeterminado, que es el archivo de variables vars/default.yml, para cargar las opciones de configuración:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Instalar prerrequisitos apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes loop: [ 'aptitude' ] # Configuración de Apache - name: Instalar LAMP paquetes apt: name={{ item }} update_cache=yes state=latest loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ] - name: Crear documento raíz file: path: "/var/www/{{ http_host }}" state: directory owner: "{{ app_user }}" mode: '0755' - name: Configurar up Apache virtualhost template: src: "files/apache.conf.j2" dest: "/etc/apache2/sites-available/{{ http_conf }}" notify: Recargar Apache - name: Habilitar nuevo sitio shell: /usr/sbin/a2ensite {{ http_conf }} notify: Recargar Apache - name: Deshabilitar predeterminado Apache sitio shell: /usr/sbin/a2dissite 000-default.conf when: disable_default notify: Recargar Apache # Configuración de MySQL - name: Establece la root contraseña mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock - name: Elimina todas las cuentas de usuario anónimasaccounts mysql_user: name: '' host_all: yes state: absent login_user: root login_password: "{{ mysql_root_password }}" - name: Elimina la base de datos de prueba de MySQLdatabase mysql_db: name: test state: absent login_user: root login_password: "{{ mysql_root_password }}" # Configuración de UFW - name: "UFW - Permitir HTTP en el puerto {{ http_port }}" ufw: rule: allow port: "{{ http_port }}" proto: tcp # Página de información de PHP - name: Configura la página de información de PHP template: src: "files/info.php.j2" dest: "/var/www/{{ http_host }}/info.php" handlers: - name: Recargar Apache service: name: apache2 state: reloaded - name: Reiniciar Apache service: name: apache2 state: restarted |
Puede modificar estos archivos según las necesidades y requisitos de su proyecto.
Conclusión
En este tutorial, seguimos los pasos para instalar y configurar LAMP en un servidor remoto con Ansible. Hay muchas otras opciones de personalización con las que puede experimentar. Por ejemplo, usar la documentación oficial de Ansible y usar los casos de mysql_user del módulo de Ansible es una excelente manera de subir de nivel. Además, siga los pasos descritos en esta guía para practicar la automatización utilizando otras herramientas de gestión de configuración y sistemas operativos para aumentar el nivel de dificultad.
¿Es nuevo en el entorno LAMP y quiere profundizar en este tema? Explore los siguientes tutoriales en nuestro blog:
- Cómo instalar WordPress con LAMP en Ubuntu 20.04
- Cómo instalar el stack Linux, Apache, MySQL, PHP (LAMP) en Centos-7
- Cómo instalar el stack LEMP Linux Nginx MySQL PHP en Ubuntu 20.04
¡Feliz informática!

Comentarios
Aún no hay comentarios. Sea el primero.