Blog de Contraslash (Legacy)

Instalando Wordpress con Ansible y Ubuntu 16.04

September 04, 2016

Instalando Wordpress con Ansible y Ubuntu 16.04

Este tutorial está basado en este tutorial de Digital Ocean

Como pre requisito está tener instalado Ansible

Primero adecuamos el sistema de carpetas

mkdir wordpress
cd wordpress
touch hosts
touch playbook.yml
mkdir roles
cd roles

Después inicializamos los roles que usaremos

ansible-galaxy init apache2
ansible-galaxy init mysql
ansible-galaxy init php
ansible-galaxy init wordpress

Ahora, definimos las tareas para apache dos

en roles/apache2/tasks/main.yml escribimos

---
- name: Update apt cache
  apt: update_cache=yes cache_valid_time=3600
  sudo: yes

- name: Install required software
  apt: name={{ item }} state=present
  sudo: yes
  with_items:
    - apache2

en roles/mysql/tasks/main.yml escribimos

---
- name: Update apt cache
  apt: update_cache=yes cache_valid_time=3600
  sudo: yes

- name: Install required software
  apt: name={{ item }} state=present
  sudo: yes
  with_items:
    - mysql-server
    - python-mysqldb
     - libmysqlclient-dev
- name: Create mysql database
  mysql_db: name={{ wp_mysql_db }} state=present

- name: Create mysql user
  mysql_user: 
    name={{ wp_mysql_user }} 
    password={{ wp_mysql_password }} 
    priv={{ wp_mysql_db }}.*:ALL

Con esto se instalará Mysql Server y se creará una base de datos con los nombres definidos en roles/mysql/vars/main.yml

Un ejemplo del archivo roles/mysql/vars/main.yml

---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: $upp3rP4$$

en roles/php/tasks/main.yml escribimos

---
- name: Update apt cache
  apt: update_cache=yes cache_valid_time=3600
  sudo: yes

- name: Install required software
  apt: name={{ item }} state=present
  sudo: yes
  with_items:
    - php7.0-mysql
    - php7.0
    - libapache2-mod-php7.0
    - php7.0-mcrypt
    - python-mysqldb

en roles/wordpress/tasks/main.yml

---
---
# tasks file for wordpress
- name: Download WordPress  
  get_url: 
      url=https://wordpress.org/latest.tar.gz 
      dest=/tmp/wordpress.tar.gz
      validate_certs=no

- name: Extract WordPress  
  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/html/{{ wordpress_site_name }} copy=no
  sudo: yes

- name: Update default Apache site
  sudo: yes
  template: src=wordpress.conf dest="/etc/apache2/sites-aviable/{{SITE_NAME}}.conf"

- name: Copy sample config file
  command: mv /var/www/html/{{ wordpress_site_name }}/wp-config-sample.php /var/www/html/{{ wordpress_site_name }}/wp-config.php creates=/var/www/html/{{ wordpress_site_name }}/wp-config.php
  sudo: yes

- name: Update WordPress config file
  lineinfile:
    dest=/var/www/html/{{ wordpress_site_name }}/wp-config.php
    regexp="{{ item.regexp }}"
    line="{{ item.line }}"
  with_items:
    - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}        
    - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}        
    - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
  sudo: yes

Como estamos creando un notify para reiniciar apache, debemos añadir esto a roles/wordpress/handlers/main.yml

---
- name: restart apache
  service: name=apache2 state=restarted
  sudo: yes

Apache necesita un archivo de configuración, así que lo incluiremos, usando este template que colocaremos en roles/wordpress/templates/wordpress.conf

<VirtualHost *:80>

    ServerName {{ wordpress_site_name }}
    ServerAdmin ma0@contraslash.com
    DocumentRoot /var/www/html/{{ wordpress_site_name }}

    <Directory /var/www/html/{{ wordpress_site_name }}/>
        Options -Indexes
            AllowOverride None
            Order allow,deny
            allow from all

        </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

También necesitamos algunas variables para que se rendericen en los archivos de configuración de apache, así que escribirmos en roles/wordpress/vars/main.yml

---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: $upp3rP4$$
wordpress_site_name: wordpress.example.com

Asegúrese de que las contraseñas de este archivo coincidan con las del rol de mysql

Para terminar, modificaremos los archivos creados al inicio del tutorial.

En hosts

[webserver]
webserver.example.com

[dbserver]
dbserver.example.com

En este archivo puede colocar las direcciones ip de sus servidores web y de bases de datos, recuerde que pueden ser el mismo

y en playbook.yml

- hosts: webserver

  roles:
    - server
    - php
    - wordpress

- hosts: dbserver

  roles:
    - mysql

Por último para aprovisionar nuestros servidores ejecutamos el siguiente comando

ansible-playbook -i hosts -u nombreUsuario -s -k playbook.yml 

Recuerde modificar el nombreUsuario en el comando anterior