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

Introducción
La automatización de servidores ahora desempeña un papel esencial en la administración de sistemas, debido a la naturaleza desechable de los entornos de aplicaciones modernos. Las herramientas de gestión de configuración, como Ansible, se utilizan normalmente para agilizar el proceso de automatización de la configuración de servidores mediante el establecimiento de procedimientos estándar para servidores nuevos y, al mismo tiempo, reducir el error humano asociado 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 funciones y módulos integrados que facilitan la escritura de scripts de automatización.
Esta guía explica cómo usar Ansible para automatizar los pasos incluidos en nuestra guía sobre Cómo instalar WordPress con LAMP en Ubuntu 18.04. WordPress es el CMS (sistema de gestión de contenido) más popular en Internet, que permite a los usuarios configurar blogs y sitios web flexibles sobre un backend MySQL con procesamiento PHP. Después de la configuración, casi toda la administración se puede realizar a través del frontend web.
Prerrequisitos
Para ejecutar la configuración automatizada proporcionada por el libro de estrategias que estamos analizando en esta guía, necesitarás:
- Un nodo de control de Ansible : una máquina Ubuntu 18.04 con Ansible instalado y configurado para conectarse a sus hosts de Ansible mediante claves SSH. Asegúrese de que el nodo de control tenga un usuario regular con permisos sudo y un firewall habilitado, como se explica en nuestra guía de configuración inicial del servidor. Para configurar Ansible, siga nuestra guía sobre Cómo instalar y configurar Ansible en Ubuntu 18.04.
- Uno o más hosts Ansible : uno o más servidores remotos Ubuntu 18.04 configurados previamente siguiendo la guía sobre Cómo usar Ansible para automatizar la configuración inicial del servidor en Ubuntu 18.04.
Antes de continuar, primero debe asegurarse de que su nodo de control de Ansible pueda conectarse y ejecutar comandos en sus hosts de Ansible. Para realizar una prueba de conexión, consulte el paso 3 de Cómo instalar y configurar Ansible en Ubuntu 18.04.
¿Qué hace este manual?
Este manual de Ansible proporciona una alternativa a la ejecución manual del procedimiento descrito en nuestra guía sobre Cómo instalar WordPress con LAMP en Ubuntu 18.04.
Al ejecutar este playbook se realizarán las siguientes acciones en sus hosts Ansible:
- Instalar
aptitude
, que Ansible prefiere como alternativa alapt
administrador de paquetes. - Instale los paquetes LAMP y las extensiones PHP necesarios.
- Cree y habilite un nuevo Apache
VirtualHost
para el sitio web de WordPress. - Habilite el
mod_rewrite
módulo de reescritura ( ) de Apache. - Deshabilitar el sitio web Apache predeterminado.
- Establezca la contraseña para el usuario root de MySQL .
- Eliminar cuentas MySQL anónimas y la base de datos de prueba.
- Cree una nueva base de datos MySQL y un usuario para el sitio web de WordPress.
- Configure UFW para permitir el tráfico HTTP en el puerto configurado (
80
por defecto). - Descargue y descomprima WordPress.
- Configure la propiedad y los permisos correctos del directorio.
- Configure el
wp-config.php
archivo utilizando la plantilla proporcionada.
Una vez que el playbook haya terminado de ejecutarse, tendrá una instalación de WordPress ejecutándose sobre un entorno LAMP, según las opciones que haya definido dentro de sus variables de configuración.
Cómo utilizar este manual
Lo primero que debemos hacer es obtener el playbook de WordPress en LAMP y sus dependencias del repositorio do-community/ansible-playbooks. Necesitamos clonar este repositorio en una carpeta local dentro del nodo de control de Ansible.
En caso de que haya clonado este repositorio anteriormente siguiendo una guía diferente, acceda a su ansible-playbooks
copia existente y ejecute un git pull
comando para asegurarse de tener el contenido actualizado:
- cd ~/ansible-playbooks
- git pull
Si es la primera vez que utiliza el do-community/ansible-playbooks
repositorio, debe comenzar clonándolo en su carpeta de inicio con:
- cd ~
- git clone https://github.com/do-community/ansible-playbooks.git
- cd ansible-playbooks
Los archivos que nos interesan se encuentran dentro de la wordpress-lamp_ubuntu1804
carpeta, que tiene la siguiente estructura:
wordpress-lamp_ubuntu1804├── files│ ├── apache.conf.j2│ └── wp-config.php.j2├── vars│ └── default.yml├── playbook.yml└── readme.md
Aquí está lo que es cada uno de estos archivos:
files/apache.conf.j2
:Archivo de plantilla para configurar Apache VirtualHost.files/wp-config.php.j2
:Archivo de plantilla para configurar el archivo de configuración de WordPress.vars/default.yml
:Archivo variable para personalizar la configuración del libro de jugadas.playbook.yml
:El archivo del libro de estrategias, que contiene las tareas que se ejecutarán en los servidores remotos.readme.md
:Un archivo de texto que contiene información sobre este libro de jugadas.
Editaremos el archivo de variables del libro de jugadas para personalizar sus opciones. Acceda al wordpress-lamp_ubuntu1804
directorio y abra el vars/default.yml
archivo usando el editor de línea de comandos que prefiera:
- cd wordpress-lamp_ubuntu1804
- nano vars/default.yml
Este archivo contiene algunas variables que requieren su atención:
vars/predeterminado.yml
---#System Settingsphp_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]#MySQL Settingsmysql_root_password: "mysql_root_password"mysql_db: "wordpress"mysql_user: "sammy"mysql_password: "password"#HTTP Settingshttp_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 cómo podría modificarlas:
php_modules
: Una matriz que contiene extensiones PHP que se deben instalar para admitir la configuración de WordPress. No es necesario cambiar esta variable, pero es posible que desee incluir nuevas extensiones en la lista si su configuración específica lo requiere.mysql_root_password
:La contraseña deseada para la cuenta raíz de MySQL.mysql_db
:El nombre de la base de datos MySQL que debe crearse para WordPress.mysql_user
:El nombre del usuario MySQL que debe crearse para WordPress.mysql_password
:La contraseña para el nuevo usuario de MySQL.http_host
:Su nombre de dominio.http_conf
:El nombre del archivo de configuración que se creará dentro de Apache.http_port
:Puerto HTTP para este host virtual, donde80
es el valor predeterminado.
Una vez que hayas terminado de actualizar las variables dentro de vars/default.yml
, guarda y cierra este archivo. Si usaste nano
, hazlo presionando CTRL + X
, Y
y luego ENTER
.
Ahora está listo para ejecutar este playbook en uno o más servidores. La mayoría de los playbooks están configurados para ejecutarse en todos los servidores de su inventario, de forma predeterminada. Podemos usar la -l
bandera para asegurarnos de que solo un subconjunto de servidores, o un solo servidor, se vea afectado por el playbook. También podemos usar la -u
bandera para especificar qué usuario del servidor remoto estamos usando para conectarnos y ejecutar los comandos del playbook en los hosts remotos.
Para ejecutar el playbook solo en server1
, conectándose como sammy
, puede usar el siguiente comando:
- ansible-playbook playbook.yml -l server1 -u sammy
Obtendrás un resultado similar a este:
OutputPLAY [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 de hojas de referencia de Ansible.
Cuando el libro de jugadas termine de ejecutarse, puedes ir a tu navegador web para finalizar la instalación de WordPress desde allí.
Navegue hasta el nombre de dominio o la dirección IP pública de su servidor:
http://server_host_or_IP
Verás una página como ésta:
Después de seleccionar el idioma que desea utilizar para su 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:
Al hacer clic en continuar, se le dirigirá a una página que le solicitará que inicie sesión:
Una vez que inicie sesión, será llevado al panel de administración de WordPress:
Algunos de los siguientes pasos comunes para personalizar su instalación de WordPress incluyen elegir la configuración de enlaces permanentes para sus publicaciones (se puede encontrar en Settings Permalinks
) y seleccionar un nuevo tema (en Appearance Themes
).
Contenido del libro de jugadas
Puede encontrar la configuración del servidor LAMP de WordPress que se incluye en este tutorial en la wordpress-lamp_ubuntu1804
carpeta dentro del repositorio de Manuales de la comunidad de DigitalOcean. Para copiar o descargar el contenido del script directamente, haga clic en el botón Sin formato que se encuentra en la parte superior de cada script.
El contenido completo del manual, así como sus archivos asociados, también se incluyen aquí para su comodidad.
vars/predeterminado.yml
El default.yml
archivo de variables contiene valores que se utilizarán dentro de las tareas del libro de estrategias, como la configuración de la base de datos y el nombre de dominio para configurar dentro de Apache.
vars/predeterminado.yml
#System Settingsphp_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]#MySQL Settingsmysql_root_password: "mysql_root_password"mysql_db: "wordpress"mysql_user: "sammy"mysql_password: "password"#HTTP Settingshttp_host: "your_domain"http_conf: "your_domain.conf"http_port: "80"
archivos/apache.conf.j2
El apache.conf.j2
archivo es un archivo de plantilla Jinja 2 que configura un nuevo Apache VirtualHost. Las variables utilizadas en esta plantilla se definen en el vars/default.yml
archivo de variables.
archivos/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
archivos/wp-config.php.j2
El wp-config.php.j2
archivo es otra plantilla de Jinja que se utiliza para configurar el archivo de configuración principal que utiliza WordPress. Las variables que se utilizan en esta plantilla se definen en el vars/default.yml
archivo de variables. Las claves de autenticación y las sales únicas se generan mediante una función hash.
archivos/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' );
libro de jugadas.yml
El playbook.yml
archivo es donde se definen todas las tareas de esta configuración. Comienza definiendo el grupo de servidores que deben ser el destino de esta configuración ( all
), después suele become: true
definir que las tareas deben ejecutarse con escalada de privilegios ( sudo
) por defecto. A continuación, incluye la vars/default.yml
variable file para cargar las opciones de configuración.
libro de jugadas.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
Siéntase libre de modificar estos archivos para adaptarlos mejor a sus necesidades individuales dentro de su propio flujo de trabajo.
Conclusión
En esta guía, utilizamos Ansible para automatizar el proceso de instalación y configuración de un sitio web de WordPress con LAMP en un servidor Ubuntu 18.04.
Si desea incluir otras tareas en este manual para personalizar aún más la configuración de su servidor, consulte nuestra guía introductoria de Ansible Gestión de configuración 101: Cómo escribir manuales de Ansible.
Deja una respuesta