Introducción
Siempre hay momentos en los que necesitamos configurar nuevos servidores. Esto podría ser para distribuir la carga de trabajo o si simplemente necesitamos más servidores. Al configurar nuevos servidores, los usuarios deben utilizar la automatización de servidores para configurarlos. Esto se hace con el fin de minimizar la intervención manual. Ansible es una de las herramientas de gestión de configuración que se pueden utilizar para configurar automáticamente un nuevo servidor, reduciendo las posibilidades de error humano al configurar el servidor manualmente.
Ansible es una herramienta rica en funciones y a la vez simple en su arquitectura. Facilita la configuración de servidores a través de scripts. Debido a su arquitectura concisa, Ansible no requiere la instalación de ningún otro software en los nodos.
En este tutorial, le mostraremos cómo usar Ansible para automatizar la instalación de WordPress con la pila LAMP ejecutándose en un servidor Ubuntu. WordPress es un CMS que se utiliza para crear blogs y sitios web utilizando PHP como lenguaje de programación y una base de datos MySQL para almacenar datos. Una vez que tengamos WordPress instalado, los usuarios pueden administrar el sitio utilizando la interfaz web.
Requisitos previos
- Dado que este tutorial se basa en Ubuntu, necesitará tener instalada la última versión de Ubuntu con permisos de sudo. Si no tiene Ubuntu instalado, puede seguir nuestro Cómo configurar su servidor Ubuntu.
- También necesitaremos tener un nodo de control de Ansible. Debe tener un nodo de control con permisos de sudo y el firewall habilitado. Instalación y configuración de Ansible en Ubuntu 20.04 contiene una guía detallada sobre cómo configurar Ansible.
- También necesitamos hosts remotos de Ansible que ejecuten la última versión de Ubuntu. Los hosts son esencialmente los nodos administrados en Ansible.
Resumen de acciones del Playbook de Ansible
En esta sección, veremos qué hace nuestro Playbook de Ansible cuando lo ejecutamos. Este procedimiento es una alternativa a la configuración manual proporcionada aquí: Cómo instalar WordPress con LAMP en Ubuntu 20.04.
Cuando ejecutemos el Playbook, Ansible hará lo siguiente:
- Instalar aptitude que es el gestor de paquetes preferido de Ansible.
- Instalar y configurar extensiones de PHP y paquetes LAMP.
- Crear un nuevo Apache VirtualHost para el sitio web de WordPress.
- Habilitar el módulo mod_rewrite y deshabilitar el sitio web predeterminado ofrecido por Apache.
- Establecer la contraseña para el usuario root de MySQL.
- Eliminar las cuentas anónimas de MySQL y la base de datos de prueba.
- Crear un nuevo usuario y una nueva base de datos. Estos serán utilizados por el sitio web de WordPress.
- Configurar UFW para permitir el tráfico HTTP en el puerto configurado ( 80 por defecto).
- Descargar y desempaquetar WordPress.
- Configurar los permisos y la propiedad de los directorios.
- Configurar un nuevo archivo wp-config.php utilizando su plantilla.
Guía del Playbook de Ansible para WordPress en LAMP
Primero, tendremos que obtener el playbook de WordPress en LAMP y sus dependencias del repositorio do-community/ansible-playbooks . Clonaremos este repositorio dentro del Nodo de Control de Ansible.
Puede ejecutar el comando git pull como se menciona a continuación:
|
1 2 3 4 5 |
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks |
Asegúrese de tener la versión actualizada del repositorio mencionado anteriormente. Esto es en caso de que haya clonado el repositorio antes. A continuación se muestra cómo puede obtener la actualización:
|
1 2 3 |
cd ~/ansible-playbooks git pull |
Ahora tenemos que ubicar los archivos dentro de la carpeta wordpress-lamp_ubuntu . El nombre de esta carpeta puede ser diferente según la versión de Ubuntu que esté utilizando. A primera vista, verá la siguiente estructura en este directorio:

A continuación, resumamos el propósito de estos archivos:
- files/apache.conf.j2: Apache utiliza VirtualHost. Este archivo se utiliza para especificar la configuración de VirtualHost.
- files/wp-config.php.j2: Este archivo contiene la configuración para configurar WordPress.
- vars/default.yml: Configura los ajustes del playbook.
- playbook.yml: Si hay tareas que deben ejecutarse en un servidor remoto, este archivo se utiliza para configurarlas.
- readme.md: Guía para usar el playbook.
Tenemos que editar el archivo de variables del playbook para personalizar la instalación. Primero, abra el archivo vars/default.yaml que se encuentra dentro del directorio mencionado anteriormente:
|
1 2 3 |
cd wordpress-lamp_ubuntu1804 nano vars/default.yml |
Este archivo es bastante largo. Tiene una serie de configuraciones para ayudarnos con nuestra instalación:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- #Configuración del Sistema php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ] #Configuración de MySQL mysql_root_password: "mysql_root_password" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "password" #Configuración de HTTP http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" |
Aquí nos interesan las siguientes variables:
- php_modules: Un array que contiene las extensiones de PHP que deben instalarse para dar soporte a su configuración de WordPress. Si desea instalar más módulos, puede especificarlo aquí.
- mysql_root_password: La contraseña para la cuenta root de MySQL.
- mysql_db: Esto especifica el nombre de la base de datos MySQL que utilizará WordPress.
- mysql_user: El nombre del usuario de MySQL que debe crearse para WordPress.
- mysql_password: La contraseña para el nuevo usuario de MySQL.
- http_host: Nombre de dominio o la IP del servidor.
- http_conf: El nombre del archivo de configuración que se creará dentro de Apache.
- http_port: Puerto HTTP para este host virtual. Este puerto se utiliza para acceder al sitio web. El valor predeterminado es 80.
A continuación, introduzca los valores en el archivo anterior, guarde y cierre. Para los usuarios que utilicen el editor nano, presione CTRL+X, Y, y presione ENTER.
Ahora está listo para ejecutar este playbook. Puede ejecutar este playbook en uno o más servidores. Si desea ejecutar este playbook en algún servidor específico, puede usar el -l parámetro. Además, si necesita especificar el usuario para conectarse al servidor remoto, especifique el usuario utilizando el -u parámetro.
Supongamos que queremos ejecutar nuestro playbook en un servidor, srvr1 utilizando el usuario u1, podemos ejecutar el siguiente comando:
|
1 |
ansible-playbook playbook.yml -l server1 -u cloudsigma |
Una vez que ejecute el comando anterior, obtendrá una salida como la siguiente:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ******************************************************************************** TASK [Gathering Facts] ******************************************************************************** ok: [server1] TASK [Install prerequisites] ******************************************************************************** ok: [server1] |
Espere hasta que se complete la ejecución del playbook. Luego, navegue al server_name en su navegador web:
|
1 |
http://server_host_or_ip/ |
Verá la pantalla:

A continuación, seleccione el idioma de su elección y presione Continue. Aparecerá la siguiente pantalla solicitando algunos detalles para finalizar la instalación:

Después de eso, introduzca la información y presione Install WordPress. Tomará algún tiempo y luego verá una pantalla como la siguiente:

Seleccione Login para iniciar sesión en su sitio web y configurar los ajustes:

Contenido del Playbook de Ansible
Recuerde la carpeta wordpress-lamp_ubuntu . Contiene algunos archivos en su interior. Así que repasémoslos uno a la vez:
● vars/default.yml
Este archivo contiene valores que se utilizan para configurar los ajustes de su sitio web de WordPress:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#Configuración del sistema php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ] #Configuración de MySQL mysql_root_password: "contraseña_root_mysql" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "contraseña" #Configuración de HTTP http_host: "tu_dominio" http_conf: "tu_dominio.conf" http_port: "80" |
● files/apache.conf.j2
Este archivo se utiliza para configurar el VirtualHost de Apache:
|
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/wp-config.php.j2
Este archivo se utiliza para configurar WordPress. Contiene claves y sales únicas generadas por funciones hash:
|
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<?php /** * Configuración básica de WordPress * * El script de creación de wp-config.php utiliza este archivo durante la * instalación. No tienes que usar el sitio web, puedes * copiar este archivo a "wp-config.php" y completar los valores. * * Este archivo contiene las siguientes configuraciones: * * * Ajustes de MySQL * * Claves secretas * * Prefijo de tablas de la base de datos * * ABSPATH * * @link https://codex.wordpress.org/Editing_wp-config.php * * @package WordPress */ // ** Ajustes de MySQL - Puedes obtener esta información de tu proveedor de alojamiento web ** // /** El nombre de la base de datos de WordPress */ define( 'DB_NAME', '{{ mysql_db }}' ); /** Nombre de usuario de la base de datos MySQL */ define( 'DB_USER', '{{ mysql_user }}' ); /** Contraseña de la base de datos MySQL */ define( 'DB_PASSWORD', '{{ mysql_password }}' ); /** Nombre de host de MySQL */ define( 'DB_HOST', 'localhost' ); /** Juego de caracteres de la base de datos a usar en la creación de tablas de la base de datos. */ define( 'DB_CHARSET', 'utf8' ); /** El tipo de cotejamiento de la base de datos. No cambies esto si tienes dudas. */ define( 'DB_COLLATE', '' ); /** Acceso al sistema de archivos **/ define('FS_METHOD', 'direct'); /**#@+ * Claves únicas y sales de autenticación. * * ¡Cambia esto por frases únicas diferentes! * Puedes generarlas usando el {@link https://api.wordpress.org/secret-key/1.1/salt/ servicio de claves secretas de WordPress.org} * Puedes cambiar esto en cualquier momento para invalidar todas las cookies existentes. Esto obligará a todos los usuarios a tener que iniciar sesión de nuevo. * * @since 2.6.0 */ define( 'AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'SECURE_AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'LOGGED_IN_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'NONCE_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'LOGGED_IN_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); define( 'NONCE_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' ); /**#@-*/ /** * Prefijo de las tablas de la base de datos de WordPress. * * Puedes tener múltiples instalaciones en una sola base de datos si le das a cada una * un prefijo único. ¡Solo números, letras y guiones bajos, por favor! */ $table_prefix = 'wp_'; /** * Para desarrolladores: modo de depuración de WordPress. * * Cambia esto a true para activar la visualización de avisos durante el desarrollo. * Se recomienda encarecidamente que los desarrolladores de plugins y temas usen WP_DEBUG * en sus entornos de desarrollo. * * Para obtener información sobre otras constantes que se pueden usar para la depuración, * visita el Codex. * * @link https://codex.wordpress.org/Debugging_in_WordPress */ define( 'WP_DEBUG', false ); /* ¡Eso es todo, deja de editar! Feliz publicación. */ /** Ruta absoluta al directorio de WordPress. */ if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', dirname( __FILE__ ) . '/' ); } /** Configura las variables de WordPress y los archivos incluidos. */ require_once( ABSPATH . 'wp-settings.php' ); |
● playbook.yml
Este archivo contiene todas las tareas definidas a partir de esta configuración. Comienza listando un grupo de servidores a los que se dirige esta configuración. Incluye el vars/default.yml archivo de variables 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Instalar requisitos previos apt: name=aptitude update_cache=yes state=latest force_apt_get=yes tags: [ sistema ] - name: Instalar paquetes LAMP apt: name={{ item }} update_cache=yes state=latest loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ] tags: [ sistema ] - name: Instalar extensiones PHP apt: name={{ item }} update_cache=yes state=latest loop: "{{ php_modules }}" tags: [ sistema ] # Configuración de Apache - name: Crear raíz del documento file: path: "/var/www/{{ http_host }}" state: directory owner: "www-data" group: "www-data" mode: '0755' tags: [ apache ] - name: Configurar up Apache VirtualHost template: src: "files/apache.conf.j2" dest: "/etc/apache2/sites-available/{{ http_conf }}" notify: Recargar Apache tags: [ apache ] - name: Habilitar módulo rewrite shell: /usr/sbin/a2enmod rewrite notify: Recargar Apache tags: [ apache ] - name: Habilitar nuevo sitio shell: /usr/sbin/a2ensite {{ http_conf }} notify: Recargar Apache tags: [ apache ] - name: Deshabilitar sitio Apache predeterminado shell: /usr/sbin/a2dissite 000-default.conf notify: Reiniciar Apache tags: [ apache ] # Configuración de MySQL - name: Establecer la contraseña de root mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock tags: [ mysql, mysql-root ] - name: Eliminar todas las cuentas de usuario anónimas mysql_user: name: '' host_all: yes state: absent login_user: root login_password: "{{ mysql_root_password }}" tags: [ mysql ] - name: Eliminar la base de datos de prueba de MySQL mysql_db: name: test state: absent login_user: root login_password: "{{ mysql_root_password }}" tags: [ mysql ] - name: Crea la base de datos para WordPress mysql_db: name: "{{ mysql_db }}" state: present login_user: root login_password: "{{ mysql_root_password }}" tags: [ mysql ] - name: Crear MySQL usuario para WordPress mysql_user: name: "{{ mysql_user }}" password: "{{ mysql_password }}" priv: "{{ mysql_db }}.*:ALL" state: present login_user: root login_password: "{{ mysql_root_password }}" tags: [ mysql ] # Configuración de UFW - name: "UFW - Permitir HTTP en el puerto {{ http_port }}" ufw: rule: allow port: "{{ http_port }}" proto: tcp tags: [ system ] # Configuración de WordPress - name: Descargar y descomprimir el último WordPress unarchive: src: https://wordpress.org/latest.tar.gz dest: "/var/www/{{ http_host }}" remote_src: yes creates: "/var/www/{{ http_host }}/wordpress" tags: [ wordpress ] - name: Establecer el propietario file: path: "/var/www/{{ http_host }}" state: directory recurse: yes owner: www-data group: www-data tags: [ wordpress ] - name: Establecer permisos para directorios shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;" tags: [ wordpress ] - name: Establecer permisos para archivos shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;" tags: [ wordpress ] - name: Configurar up wp-config template: src: "files/wp-config.php.j2" dest: "/var/www/{{ http_host }}/wordpress/wp-config.php" tags: [ wordpress ] handlers: - name: Recargar Apache service: name: apache2 state: reloaded - name: Reiniciar Apache service: name: apache2 state: restarted |
Puede modificar estos archivos según sea necesario para adaptarlos a sus necesidades específicas para el sitio web que está construyendo.
Conclusión
En este tutorial, demostramos cómo puede automatizar la instalación y configuración de un sitio web de WordPress que se ejecuta en la pila LAMP en el último sistema operativo Ubuntu con Ansible.
Para obtener más guías sobre cómo trabajar con Ansible, puede consultar los siguientes tutoriales en nuestro blog:
- Uso de Ansible con CloudSigma
- Automatización de la configuración del servidor usando Ansible y Ubuntu 20.04
- Instalación y configuración de LAMP en Ubuntu 20.04 con Ansible
¡Feliz informática!
Comentarios
Aún no hay comentarios. Sea el primero.