Playbook de despliegue de un sitio de eCommerce

Playbook de despliegue de un sitio de eCommerce

 

Este playbook despliega una solución completa de comercio electrónico sobre un servidor RHEL 7.1 ejecutando código magento en un servidor Nginx y procesamiento PHP usando PHP-FPM; la base de datos es MySQL.

El código es una actualización de la versión publicada en GitHub: https://github.com/drewkerrigan/ansible-magento

La estructura del playbook es la siguiente:

── group_vars
│   └── all
├── LICENSE.md
├── plugin
│   └── inventory
│   └── vagrant.py
├── README.md
├── roles
│   ├── common
│   │   ├── files
│   │   │   ├── epel-release-latest-7.noarch.rpm
│   │   │   ├── epel.repo
│   │   │   ├── iptables-save
│   │   │   ├── remi.repo
│   │   │   └── RPM-GPG-KEY-EPEL-7
│   │   ├── handlers
│   │   │   └── main.yml
│   │   └── tasks
│   │   └── main.yml
│   ├── magento
│   │   ├── files
│   │   │   ├── epel-release-latest-7.noarch.rpm
│   │   │   ├── magento-1.8.1.0.tar-2015-02-10-10-08-16.gz
│   │   │   └── mysql57-community-release-el7-7.noarch.rpm
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │   ├── config.php
│   │   └── root.cnf.j2
│   ├── mysql
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │   └── my.cnf.j2
│   ├── nginx
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │   └── default.conf
│   └── php-fpm
│   ├── handlers
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   └── templates
│   └── magento.conf
└── site.yml

Es útil recordar algunos conceptos.

Group Vars

Son variables que van a aplicar a todo el grupo y por tal motivo, es conveniente ponerlas en un lugar específico y no en el playbook o en el archivo de inventario.

Handlers

Son tareas, al igual que las programadas en el playbook, pero que se ejecutan solo cuando existe la directiva “notify”.

Templates

Vamos a poner aquí archivos que deban transferirse como resultado de una directiva del playbook.

El playbook lo ejecturatemos de la siguiente manera:

ansible-playbook site.yml

El contenido del archivo es el siguiente.

---
- name: Install Magento, MySQL, Nginx, and PHP-FPM
 hosts: magentoHosts
 user: telans
 sudo: yes

 roles:
 - common
 - mysql
 - nginx
 - php-fpm
 - magento

Al ejecutar los roles, ejecutará los playbooks programados en cada subdirectorio “task”, ellos son:

  • Common: realiza tareas sobre el sistema operativo para agregar repositorios e instalar software de base
  • MySQL, Nginx, php-fpm y Magento: instalan motor de base de datos, web server, procesador de PHP y software de eCommerce respectivamente.

Common

---
- name: Install libselinux-python
 yum: name=libselinux-python state=present

- name: Copy the EPEL repository definition
 copy: src=epel.repo dest=/etc/yum.repos.d/epel.repo

- name: Create the GPG key for EPEL
 copy: src=RPM-GPG-KEY-EPEL-7 dest=/etc/pki/rpm-gpg

- name: Set up iptables rules
 copy: src=iptables-save dest=/etc/sysconfig/iptables
 notify: restart iptables

- name: Copy additional repos
 copy: src={{ item }} dest=/tmp
 with_items:
 - epel-release-latest-7.noarch.rpm
 - mysql57-community-release-el7-7.noarch.rpm

- name: Install aditional repos
 command: yum install -y {{ item }}
 with_items:
 - /tmp/epel-release-latest-7.noarch.rpm
 - /tmp/mysql57-community-release-el7-7.noarch.rpm
 - http://rpms.remirepo.net/enterprise/remi-release-7.rpm

- name: Config remi repo
 copy: src={{ item }} dest=/etc/yum.repos.d
 with_items:
 - remi.repo

En este playbook instalamos librerías, agregamos repositorios necesarios para posteriores instalaciones y aplicamos configuración de iptables para asegurar el entorno de la aplicación.

MySQL

---
- name: Install Mysql package
 yum: name={{ item }} state=present
 with_items:
 - mysql-community-server
 - MySQL-python
 - libselinux-python
 - libsemanage-python

- name: Configure SELinux to start mysql on any port
 seboolean: name=mysql_connect_any state=true persistent=yes

- name: Create Mysql configuration file
 template: src=my.cnf.j2 dest=/etc/my.cnf
 notify:
 - restart mysql

- name: Start Mysql Service
 service: name=mysqld state=started enabled=true

Aquí instalamos el motor de base de datos, aplicamos configuraciones de arranque y valores de parámetros en el archivo de configuración por defecto. Finalmente se ejecuta un handler para levantar el demonio de base de datos.

Nginx

---
- name: Install nginx
 yum: name=nginx state=present

- name: Copy nginx configuration for magento
 template: src=default.conf dest=/etc/nginx/conf.d/default.conf
 notify: restart nginx

Instalamos el web server Nginx en lugar de apache debido a que tiene mejores prestaciones en términos de rendimiento y seguridad; aplicamos la configuración que deseamos y finalmente ordenamos encender el servicio.

Php-fpm

---
- name: Install php-fpm and deps
 yum: name={{ item }} state=present
 with_items:
 - php
 - php-fpm
 - php-enchant
 - php-IDNA_Convert
 - php-mbstring
 - php-mysql
 - php-PHPMailer
 - php-process
 - php-simplepie
 - php-xml

- name: Disable default pool
 command: mv /etc/php-fpm.d/www.conf 
        /etc/php-fpm.d/www.disabled creates=/etc/php-fpm.d/www.disabled
 notify: restart php-fpm

- name: Copy php-fpm configuration
 template: src=magento.conf dest=/etc/php-fpm.d/
 notify: restart php-fpm

Php-fpm es una implementación alternativa para ejecución de código PHP y es muy útil para sitios de mucho tráfico. En este playbook instalamos todos los paquetes de software necesarios, aplicamos las configuraciones requeridas. Notemos que el servicio el handler reinicia el servicio dos veces.

Magento

---
- name: Copy Magento
 copy: src=magento-1.8.1.0.tar-2015-02-10-10-08-16.gz dest=/srv

- name: Extract archive
 command: chdir=/srv/ /bin/tar xvfz magento-1.8.1.0.tar-2015-02-10-10-08-16.gz creates=/srv/magento

- name: Add group "magento"
 group: name=magento

- name: Add user "magento"
 user: name=magento group=magento home=/srv/magento/

- name: Update MySQL root password for all root accounts
 mysql_user:
 name: root
 host: "{{ item }}"
 password: "{{ mage_db_password }}"
 state: present
 with_items:
 - "{{ inventory_hostname }}"
 - 127.0.0.1
 - ::1
 - localhost

- name: Copy the root credentials as .my.cnf file
 template: src=root.cnf.j2 dest=~/.my.cnf mode=0600

- name: Ensure Anonymous user(s) are not in the database
 mysql_user:
 name: ''
 host: "{{ item }}"
 state: absent
 with_items:
 - localhost
 - "{{ inventory_hostname }}"

- name: Create Magento database
 mysql_db: name={{ mage_db_name }} state=present

- name: Create Magento database user
 mysql_user: name={{ mage_db_user }} password={{ mage_db_password }} priv={{ mage_db_name }}.*:ALL host='localhost' state=present

- name: Change ownership of Magento installation
 file: path=/srv/magento/ owner=magento group=magento state=directory recurse=yes

Este es el playbook más completo del grupo; vamos a agrupar y detallar cada de los pasos.

  • “Copy magento” y “Extract file” copian el contenido del código de la versión 1.8.1.0 dentro del servidor target. Alternativamente puede obtenerse una versión del sitio www.magentocommerce.com. Extraemos el archivo alojándolo en /srv/magento.
  • “Add group ‘magento'” y “Add user ‘magento'” permiten configurar el entorno donde se ejectutará la aplicación.
  • “Update MySQL root password for all root accounts”, “Copy the root credentials as .my.cnf file” y “Ensure Anonymous user(s) are not in the database” cambian la configuración de seguridad por defecto de MySQL; esto nos va a permitir generar una nueva base de datos.
  • “Create Magento database” y “Create Magento database user” crean la base de datos del aplicativo y el usuario que será propietario del esquema.
  • “Change ownership of Magento installation” hará que todo el código magento sea propiedad del usuario “magento” y no de root.

Mostramos a continuación la ejecución del playbook.
Parte 1. Playbooks common, mysql, nginx y php-fpm.

Parte 2. Playbook magento

Es importante rescatar la estructura modular del playbook, ya que nos permitirá reusar código de manera eficiente; así por ejemplo, podríamos crear un directorio llamado “magento2.0.2” para instalar específicamente esa versión del producto o “mariadb” en lugar de “mysql” para reemplazar la versión del motor de base de datos o bien “apache” en lugar de “nginx”. Entonces escribiríamos un playbook de esta forma.

---
- name: Install Magento, MariaDB, and Apache
 hosts: magentoHosts
 user: telans
 sudo: yes

 roles:
 - common
 - mariadb
 - apache
 - magento2.0.2

 

Por Rex Torti y Pablo Calvo

Dejá un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *