Tutorial

Cómo usar Ansible para instalar y configurar LAMP en Ubuntu 18.04

Published on February 20, 2020

Developer Advocate

Español
Cómo usar Ansible para instalar y configurar LAMP en Ubuntu 18.04

Introducción

Debido al carácter desechable de los entornos de aplicaciones modernos, la automatización de servidores ahora desempeña un papel fundamental en la administración de sistemas. Las herramientas de gestión de configuración como Ansible suelen utilizarse para optimizar el proceso de automatización de la configuración de los servidores estableciendo procedimientos estándares para nuevos servidores y reduciendo los errores humanos asociados con las configuraciones manuales.

Ansible ofrece una arquitectura sencilla que no requiere la instalación de software especial en los nodos. También proporciona un conjunto sólido de características y módulos incorporados que facilitan la escritura de secuencias de comandos de automatización.

En esta guía, se explica la forma de usar Ansible para automatizar los pasos de nuestra guía Cómo instalar en Ubuntu 18.04 la pila LAMP: Linux, Apache, MySQL y PHP. Una pila “LAMP” es un grupo de aplicaciones de software de código abierto que se instalan normalmente juntas para permitir que un servidor aloje aplicaciones web y sitios web dinámicos. Este término es en realidad un acrónimo que representa al sistema operativo Linux y al servidor web Apache. Los datos del sitio se almacenan en una base de datos MySQL y el contenido dinámico se procesa mediante PHP.

Requisitos previos

Para ejecutar la configuración automatizada disponible en el playbook que analizaremos en esta guía, necesitará lo siguiente:

Antes de continuar, primero necesita asegurarse de que su nodo de control de Ansible pueda establecer conexión y ejecutar comandos en sus hosts de Ansible. Para acceder a una prueba de conexión, consulte el paso 3 de Cómo instalar y configurar Ansible en Ubuntu 18.04.

¿Qué hace este playbook?

Este playbook de Ansible ofrece una alternativa a la ejecución manual a través del procedimiento descrito en nuestra guía Cómo instalar en Ubuntu 18.04 la pila LAMP: Linux, Apache, MySQL y PHP.

La ejecución de este playbook realizará las siguientes acciones en sus hosts de Ansible:

  1. Instale aptitude, la alternativa que Ansible prefiere en comparación con el administrador de paquetes apt.
  2. Instale los paquetes LAMP necesarios.
  3. Cree un nuevo VirtualHost de Apache y configure un root de documentos específico para ello.
  4. Habilite el nuevo VirtualHost.
  5. Desactive el sitio web predeterminado de Apache cuando el valor de la variable disable_default sea true.
  6. Establezca la contraseña para el usuario root de MySQL.
  7. Elimine las cuentas anónimas de MySQL y la base de datos de prueba.
  8. Configure UFW para que permita el tráfico HTTP en el puerto configurado (por defecto, el 80).
  9. Establezca una secuencia de comandos de prueba de PHP usando la plantilla proporcionada.

Una vez que el playbook se haya ejecutado por completo, dispondrá de un entorno de PHP web en ejecución sobre Apache, según las opciones que definió dentro de sus variables de configuración.

Cómo usar este playbook

Lo primero que debemos hacer es obtener el playbook de LAMP y sus dependencias del repositorio do-community/ansible-playbooks​​. Debemos clonar este repositorio en una carpeta local dentro del nodo de control de Ansible.

En caso de que haya clonado este repositorio antes siguiendo otra guía, acceda a su copia de ansible-playbooks existente y ejecute un comando git pull para asegurarse de disponer de contenido actualizado:

  1. cd ~/ansible-playbooks
  2. git pull

Si es la primera vez que utiliza el repositorio do-community/ansible-playbooks​​​, debe comenzar por clonarlo y disponerlo en su carpeta de inicio con lo siguiente:

  1. cd ~
  2. git clone https://github.com/do-community/ansible-playbooks.git
  3. cd ansible-playbooks

Los archivos que nos interesan se encuentran dentro de la carpeta lamp_ubuntu1804, que tiene la siguiente estructura:

lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── info.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

A continuación, se ofrece una descripción de estos archivos:

  • files/info.php.j2: archivo plantilla con el que se configura una página de prueba PHP en el root del servidor web.
  • files/apache.conf.j2: archivo plantilla con el que se configura el host virtual de Apache.
  • vars/default.yml: archivo variable que permite personalizar la configuración del playbook.
  • playbook.yml: archivo del playbook. Contiene las tareas que se ejecutarán en los servidores remotos.
  • readme.md: archivo de texto que contiene información sobre este playbook.

Modificaremos el archivo variable del playbook para personalizar las configuraciones de MySQL y Apache. Acceda al directorio lamp_ubuntu1804​​​ y abra el archivo vars/default.yml usando el editor de línea de comandos que prefiera:

  1. cd lamp_ubuntu1804
  2. nano vars/default.yml

Este archivo contiene algunas variables que requieren su atención:

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

La siguiente lista contiene una breve explicación de cada una de estas variables y de la forma en que podría querer cambiarlas:

  • mysql_root_password: contraseña deseada para la cuenta root de MySQL.
  • app_user: usuario remoto no root en el host de Ansible que se configurará como propietario de los archivos de la aplicación.
  • http_host: su nombre de dominio.
  • http_conf: nombre del archivo de configuración que se creará en Apache.
  • http_port: puerto HTTP para este host virtual. 80 es el valor predeterminado.
  • disable_default: parámetro que determina si desactiva o no el sitio web predeterminado que viene con Apache.

Una vez que termine de actualizar las variables dentro de vars/default.yml, guarde y cierre este archivo. Si utiliza nano, podrá hacerlo presionando CTRL+X, Y y luego ENTER.

Ahora, estará listo para ejecutar este playbook en uno o más servidores. La mayoría de los playbooks se configuran para ejecutarse, por defecto, en todos los servidores de su inventario. Podemos usar el indicador -l para asegurarnos de que el playbook solo tenga efecto sobre un subconjunto de servidores o un único servidor. También podemos usar el indicador -u a fin de especificar el usuario del servidor remoto que usaremos para conectar y ejecutar los comandos del playbook en los hosts remotos.

Para ejecutar solo el playbook en server1, conectándose como sammy, puede usar el siguiente comando:

  1. ansible-playbook playbook.yml -l server1 -u sammy

Verá un resultado similar a este:

Output
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

Nota: para obtener más información sobre cómo ejecutar playbooks de Ansible consulte nuestra guía Referencia de Ansible.

Cuando finalice la ejecución del playbook, diríjase a su navegador web y acceda al host o a la dirección IP del servidor, según la configuración de las variables del playbook, con /info.php al final:

http://server_host_or_IP/info.php

Verá una página como la siguiente:

Página phpinfo

Debido a que esta página contiene información confidencial sobre su entorno de PHP, se le recomienda eliminarlo del servidor ejecutando un comando rm -f /var/www/info.php una vez que termine de configurarlo.

Contenido del playbook

Puede encontrar la configuración del servidor LAMP que se presenta en este tutorial en la carpeta lample_ubuntu1804 dentro del repositorio de playbooks para la comunidad de DigitalOcean. Para copiar o descargar el contenido de la secuencia de comandos directamente, haga clic en el botón Raw hacia la parte superior de cada secuencia de comandos.

Para su conveniencia, también se incluyen el contenido completo del playbook y sus archivos asociados.

vars/default.yml

El archivo variable default.yml contiene valores que se utilizarán en las tareas del playbook, como la contraseña de la cuenta** root** de MySQL y el nombre de dominio para la configuración dentro de Apache.

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
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 de Jinja 2 que configura un nuevo host virtual de Apache. Las variables que se utilizan dentro de esta plantilla se definen en el archivo variable vars/default.yml.

files/apache.conf.j2
<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

El archivo info.php.j2 es otra plantilla de Jinja, que se utiliza para configurar una secuencia de comandos de PHP de prueba en el root del documento del servidor LAMP recién configurado.

files/info.php.j2
<?php
phpinfo();

playbook.yml

En el archivo playbook.yml se definen todas las tareas de esta configuración. Comienza definiendo el grupo de servidores a los que esta configuración debe orientarse (todos), después de lo cual utiliza become: true para determinar que las tareas deben ejecutarse con elevación de privilegios (sudo) por defecto. Luego, incluye el archivo variable vars/default.yml para cargar las opciones de configuración.

playbook.yml

---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install prerequisites
      apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
      loop: [ 'aptitude' ]

  #Apache Configuration
    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]

    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "{{ app_user }}"
        mode: '0755'

    - name: Set up Apache virtualhost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      when: disable_default
      notify: Reload Apache

  # MySQL Configuration
    - name: Sets the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock

    - name: Removes all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

    - name: Removes the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

  # UFW Configuration
    - name: "UFW - Allow HTTP on port {{ http_port }}"
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp

  # PHP Info Page
    - name: Sets Up PHP Info Page
      template:
        src: "files/info.php.j2"
        dest: "/var/www/{{ http_host }}/info.php"

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

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

Puede modificar estos archivos para que se adapten mejor a sus necesidades individuales dentro de su propio flujo de trabajo.

Conclusión

A lo largo de esta guía, usamos Ansible para automatizar el proceso de instalación y configuración de un entorno LAMP en un servidor remoto. Debido a que en cada caso suele haber necesidades diferentes al trabajar con bases de datos y usuarios de MySQL, le recomendamos verificar la documentación oficial de Ansible para acceder a más información y casos de uso relacionados con el módulo mysql_user Ansible.

Si desea incluir otras tareas en este playbook para personalizar aún más la configuración de su servidor, consulte nuestra guía de introducción a Ansible Nociones básicas de administración de configuraciones: escribir playbooks de Ansible.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Developer Advocate

Dev/Ops passionate about open source, PHP, and Linux.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Become a contributor for community

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

DigitalOcean Documentation

Full documentation for every DigitalOcean product.

Resources for startups and SMBs

The Wave has everything you need to know about building a business, from raising funding to marketing your product.

Get our newsletter

Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

New accounts only. By submitting your email you agree to our Privacy Policy

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.