Tutorial

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

Published on February 20, 2020
Default avatar

By Erika Heidi

Developer Advocate

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

Introducción

La automatización del servidor ahora desempeña un papel fundamental en la administración de sistemas, debido al carácter desechable de los entornos de aplicaciones modernas. 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 WordPress con LAMP en Ubuntu 18.04. WordPress es el CMS (sistema de gestión de contenidos) más popular de Internet y permite a los usuarios configurar blogs y sitios web flexibles sobre un backend de MySQL con procesamiento PHP. Después de la configuración, casi toda la administración puede hacerse a través del cliente web.

Requisitos previos

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

Antes de proceder, primero deberá 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 WordPress con LAMP en Ubuntu 18.04.

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 las extensiones de PHP y los paquetes LAMP necesarios.
  3. Cree y habilite un nuevo VirtualHost de Apache para el sitio web de WordPress.
  4. Habilite el módulo de reescritura (mod_rewrite) de Apache.
  5. Desactive el sitio web predeterminado de Apache.
  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. Cree una base de datos y un usuario de MySQL nuevos para el sitio web de WordPress.
  9. Configure UFW para que permita el tráfico HTTP en el puerto configurado (por defecto, el 80).
  10. Descargue y descomprima WordPress.
  11. Establezca la propiedad de directorio y los permisos correctos.
  12. Configure el archivo wp-config.php usando la plantilla proporcionada.

Una vez que finalice la ejecución del playbook, tendrá una instalación de WordPress en ejecución sobre un entorno de LAMP, según las opciones que definió en sus variables de configuración.

Cómo usar este playbook

Lo primero que debemos hacer es obtener el playbook de WordPress en LAMP y sus dependencias del repositorio de 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 wordpress-lamp_ubuntu1804, que tiene la siguiente estructura:

wordpress-lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── wp-config.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

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

  • files/apache.conf.j2: archivo plantilla con el que se configura VirtualHost de Apache.
  • files/wp-config.php.j2: archivo plantilla con el que se prepara el archivo de configuración de WordPress.
  • vars/default.yml: archivo de variables 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.

Editaremos el archivo de variables del playbook para personalizar sus opciones. Acceda al directorio lamp_ubuntu1804​​​ y abra el archivo vars/default.yml usando el editor de línea de comandos que prefiera:

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

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

vars/default.yml
---
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

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

  • php_modules: matriz que contiene extensiones de PHP que se deben instalar para respaldar su configuración de WordPress. No necesita modificar esta variable, pero es posible que le resulte conveniente incluir nuevas extensiones a la lista si su configuración específica lo requiere.
  • mysql_root_password: contraseña deseada para la cuenta **root **de MySQL.
  • mysql_db: nombre de la base de datos de MySQL que debe crear para WordPress.
  • mysql_user: nombre del usuario de MySQL que debe crear para WordPress.
  • mysql_password: contraseña para el nuevo usuario de MySQL.
  • 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.

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 emplearemos 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] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 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, puede acceder a su navegador web para terminar la instalación de WordPress desde allí.

Diríjase al nombre de dominio o a la dirección IP pública de su servidor:

http://server_host_or_IP

Verá una página como la siguiente:

Página de selección de idioma de WordPress

Después de seleccionar el idioma que desea usar para la instalación de WordPress, se le presentará un paso final para configurar su usuario y contraseña de WordPress para que pueda iniciar sesión en su panel de control:

Configuración de WordPress

Cuando haga clic para seguir, accederá a una página que le solicitará registrarse:

Solicitud de inicio de sesión de WP

Tras iniciar sesión, accederá al panel de administración de WordPress:

Panel de administración de WP

Algunos de los siguientes pasos frecuentes para personalizar su instalación de WordPress comprenden la elección de la configuración de vínculos permanentes para sus publicaciones (se puede encontrar en Settings > Permalinks) y la selección de un nuevo tema (en Appearance > Themes).

Contenido del playbook

Puede encontrar la configuración del servidor de WordPress en LAMP que se presenta en este tutorial en la carpeta wordpress-lamp_ubuntu1804, dentro del repositorio de playbooks de 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 de variables default.yml contiene valores que se utilizarán en las tareas del playbook, como los ajustes de la base de datos y el nombre de dominio para la configuración dentro de Apache.

vars/default.yml
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

files/apache.conf.j2

El archivo apache.conf.j2 es un archivo 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 de variables 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/wp-config.php.j2

El archivo wp-config.php.j2 es otra plantilla de Jinja que se utiliza para aplicar ajustes al archivo de configuración principal que utiliza WordPress. Las variables que se utilizan dentro de esta plantilla se definen en el archivo de variables vars/default.yml. Las claves y sales de autenticación únicas se generan usando la función hash.

files/info.php.j2
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ mysql_db }}' );

/** MySQL database username */
define( 'DB_USER', '{{ mysql_user }}' );

/** MySQL database password */
define( 'DB_PASSWORD', '{{ mysql_password }}' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/** Filesystem access **/
define('FS_METHOD', 'direct');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @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') }}' );

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );

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 (all), 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 de variables 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=aptitude update_cache=yes state=latest force_apt_get=yes
      tags: [ system ]

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

    - name: Install PHP Extensions
      apt: name={{ item }} update_cache=yes state=latest
      loop: "{{ php_modules }}"
      tags: [ system ]

  # Apache Configuration
    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "www-data"
        group: "www-data"
        mode: '0755'
      tags: [ apache ]

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

    - name: Enable rewrite module
      shell: /usr/sbin/a2enmod rewrite
      notify: Reload Apache
      tags: [ apache ]

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

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      notify: Restart Apache
      tags: [ apache ]

  # MySQL Configuration
    - name: Set the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock
      tags: [ mysql, mysql-root ]

    - name: Remove all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Remove the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Creates database for WordPress
      mysql_db:
        name: "{{ mysql_db }}"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Create MySQL user for 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 ]

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

  # WordPress Configuration
    - name: Download and unpack latest 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: Set ownership
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        recurse: yes
        owner: www-data
        group: www-data
      tags: [ wordpress ]

    - name: Set permissions for directories
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;"
      tags: [ wordpress ]

    - name: Set permissions for files
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;"
      tags: [ wordpress ]

    - name: Set up wp-config
      template:
        src: "files/wp-config.php.j2"
        dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
      tags: [ wordpress ]

  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

En esta guía, usamos Ansible para automatizar el proceso de instalación y configuración de un sitio web de WordPress con LAMP en un servidor de Ubuntu 18.04.

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 gestión de configuración: 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 us


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?
 
1 Comments


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!

Ansible gives this error: “mysql_root_password is not a module recognized” I think is something related to the secure installation, but I cant make this work

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!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

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

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel