Creación de playbooks con ansible en Debian 12

playbooks-ansible

¿Que es ansible?

Ansible es una herramienta de software libre que permite a los usuarios configurar y administrar ordenadores de forma centralizada. Es una herramienta de administración de configuración, que controla el estado de un sistema y lo mantiene en un estado deseado, confirmando que se cumplan las políticas de configuración definidas.

Requisitos

  • Sistema Debian 12 actualizado.
  • Privilegios de root o sudo.
  • Acceso a internet.
  • Ansible instalado.

Creacion del entorno de trabajo

Para crear nuestro entorno de trabajo vamos a ejecutar el siguiente script que creara los directorios y archivos necesarios para trabajar con ansible. Tambien creara algunos archivos de ejemplo.

#!/bin/bash

# Crear directorios principales
mkdir -p ansible/group_vars ansible/roles/common/tasks ansible/roles/common/handlers ansible/roles/common/files ansible/roles/common/templates ansible/roles/common/vars

# Crear archivos en directorios específicos (puedes añadir contenido según sea necesario)
touch ansible/hosts ansible/group_vars/all.yml ansible/roles/common/vars/main.yml ansible/roles/common/tasks/main.yml ansible/roles/common/handlers/main.yml ansible/roles/common/templates/nginx.conf.j2 ansible/site.yml>

# Contenido de ejemplo para algunos archivos
echo "[web_servers]" >> ansible/hosts
echo "server1 ansible_host=192.168.1.10" >> ansible/hosts
echo "server2 ansible_host=192.168.1.11" >> ansible/hosts

echo "ansible_user: your_ssh_user" >> ansible/group_vars/all.yml
echo "ansible_private_key: /path/to/your/private/key.pem" >> ansible/group_vars/all.yml

echo "nginx_port: 80" >> ansible/roles/common/vars/main.yml

echo "- name: Ensure Nginx is installed" >> ansible/roles/common/tasks/main.yml
echo "  apt:" >> ansible/roles/common/tasks/main.yml
echo "    name: nginx" >> ansible/roles/common/tasks/main.yml
echo "    state: present" >> ansible/roles/common/tasks/main.yml

echo "- name: Configure Nginx" >> ansible/roles/common/tasks/main.yml
echo "  template:" >> ansible/roles/common/tasks/main.yml
echo "    src: nginx.conf.j2" >> ansible/roles/common/tasks/main.yml
echo "    dest: \"/etc/nginx/nginx.conf\"" >> ansible/roles/common/tasks/main.yml
echo "  notify: Reload Nginx" >> ansible/roles/common/tasks/main.yml

echo "---" >> ansible/site.yml
echo "- hosts: web_servers" >> ansible/site.yml
echo "  become: yes" >> ansible/site.yml
echo "  roles:" >> ansible/site.yml
echo "    - common" >> ansible/site.yml

Configuración del entorno de trabajo

Ya tenemos la base de nuestro entorno de trabajo, ahora vamos a realizar la configuracion necesaria para poder trabajar con ansible.

Configuración del fichero ansible.cfg

El fichero ansible.cfg es el fichero de configuracion de ansible, en el vamos a configurar la ruta de los inventarios, el usuario y la clave privada que vamos a utilizar para conectarnos a los nodos…

[defaults]
inventory = hosts # fichero de inventario
remote_user = root # usuario con el que nos conectaremos a los nodos
host_key_checking = False # desactivamos la comprobacion de claves ssh
environment = LC_ALL=C.UTF-8 # configuramos el idioma

Creación de playbooks

Ahora que ya tenemos nuestro entorno de trabajo configurado vamos a crear nuestros playbooks.

En este post vamos a crear playbooks que cumplan con las siguientes tareas:

  • Actualizar los paquetes del sistema.
  • Instalar el paquete apache2.
  • Instalar y configurar mariadb-server.
  • Instalar wordpress.
  • Instalar nextcloud.

Playbook para actualizar los paquetes del sistema

Este playbook lo crearemos en el directorio “roles/common” ya que es un playbook que vamos a utilizar en todas las maquinas.

La creacion de este playbook es muy sencilla, solo tenemos que crear un fichero llamado main.yml en el directorio “roles/common/tasks” y añadir el siguiente contenido (Si tiene contenido de ejemplo eliminalo).

Playbook para actualizar los paquetes del sistema: Directorio tasks
- name: Actualización de paquetes # nombre de la tarea
  apt: update_cache=yes upgrade=yes # Indicamos al modulo apt que actualice los paquetes

Este playbook lo que hace es utilizar apt para actualizar los paquetes del sistema.

Playbook para instalar apache2

Para crear este playbook vamos a crear un directorio llamado “apache2” en el directorio “roles” y dentro de este directorio crearemos el directorio “tasks” y dentro de este directorio crearemos el fichero main.yml con el siguiente contenido.

Playbook para instalar apache2: Directorio tasks

- name: Instalando paquete apache2 # nombre de la tarea
  apt: # modulo apt
    pkg:
      - apache2 # paquete a instalar
    state: latest # instalamos la ultima version del paquete

Este playbook lo que hace es utilizar apt para instalar la ultima version del paquete apache2.

Playbook para instalar y configurar mariadb-server

Para crear este playbook vamos a crear un directorio llamado “mariadb” en el directorio “roles” y dentro de este directorio crearemos los directorios “tasks”, “handlers”, “files” y “vars”.

Playbook para instalar y configurar mariadb-server: files

En el directorio “files” vamos a crear un fichero llamado “50-server.cnf” con el siguiente contenido.

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#

#user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
#datadir                 = /var/lib/mysql
#tmpdir                  = /tmp

# Broken reverse DNS slows down connections considerably and name resolve is
# safe to skip if there are no "host by domain name" access grants
#skip-name-resolve

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0

#
# * Fine Tuning
#

#key_buffer_size        = 128M
#max_allowed_packet     = 1G
#thread_stack           = 192K
#thread_cache_size      = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
#myisam_recover_options = BACKUP
#max_connections        = 100
#table_cache            = 64

#
# * Logging and Replication
#

# Note: The configured log file or its directory need to be created
# and be writable by the mysql user, e.g.:
# $ sudo mkdir -m 2750 /var/log/mysql
# $ sudo chown mysql /var/log/mysql

# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# Recommend only changing this at runtime for short testing periods if needed!
#general_log_file       = /var/log/mysql/mysql.log
#general_log            = 1

# When running under systemd, error logging goes via stdout/stderr to journald
# and when running legacy init error logging goes to syslog due to
# /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf
# Enable this if you want to have error logging into a separate file
#log_error = /var/log/mysql/error.log
# Enable the slow query log to see queries with especially long duration
#log_slow_query_file    = /var/log/mysql/mariadb-slow.log
#log_slow_query_time    = 10
#log_slow_verbosity     = query_plan,explain
#log-queries-not-using-indexes
#log_slow_min_examined_row_limit = 1000

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
#max_binlog_size        = 100M

#
# * SSL/TLS
#

# For documentation, please read
# https://mariadb.com/kb/en/securing-connections-for-client-and-server/
#ssl-ca = /etc/mysql/cacert.pem
#ssl-cert = /etc/mysql/server-cert.pem
#ssl-key = /etc/mysql/server-key.pem
#require-secure-transport = on

#
# * Character sets
#

# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * InnoDB
#

# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# Most important is to give InnoDB 80 % of the system RAM for buffer use:
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size
#innodb_buffer_pool_size = 8G

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.11 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.11]

Lo que acabamos de hacer es crear un fichero de configuracion para mariadb-server con algunas modificaciones para que permita conexiones remotas.

Playbook para instalar y configurar mariadb-server: Directorio vars

En el directorio “vars” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

mysql_root_pass: root # contraseña del usuario root de mariadb

Creamos una variable con la nueva contraseña del usuario root de mariadb.

Playbook para instalar y configurar mariadb-server: Directorio handlers

En el directorio “handlers” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: restart mariadb
  service: name=mariadb state=restarted

Definimos un handler que reiniciara el servicio de mariadb.

Playbook para instalar y configurar mariadb-server: Directorio tasks

En el directorio “tasks” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: Instalación de paquetes
  apt:
    pkg:
      - mariadb-server
      - python3-mysqldb
    state: latest
- name: Configurando mariadb
  copy: >
    src=files/50-server.cnf
    dest=/etc/mysql/mariadb.conf.d/
    owner=root
    group=root
  notify:
    restart mariadb
- name: Cambiando contraseña root
  mysql_user:
    name: root
    password: "{{ mysql_root_pass }}"
    host: '%'
    priv: '*.*:ALL,GRANT'
    login_unix_socket: /var/run/mysqld/mysqld.sock
    state: present

Este playbook lo que hace es utilizar apt para instalar la ultima version del paquete mariadb-server y python3-mysqldb, copia el fichero de configuracion de mariadb-server que hemos creado en el directorio “files” al directorio “/etc/mysql/mariadb.conf.d/” y cambia la contraseña del usuario root de mariadb.

Playbook para instalar wordpress

Para crear este playbook vamos a crear un directorio llamado “wordpress” en el directorio “roles” y dentro de este directorio crearemos los directorios “tasks”, “handlers”, “templates” y “vars”.

Playbook para instalar wordpress: Directorio handlers

En el directorio “handlers” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: restart apache2
  service: name=apache2 state=restarted

Definimos un handler que reiniciara el servicio de apache2.

Playbook para instalar wordpress: Directorio templates

En el directorio “templates” vamos a crear los ficheros “wp-config.php.j2” y “wordpress.conf.j2” con el siguiente contenido.

wp-config.php.j2

Este fichero lo utilizaremos para configurar la base de datos de wordpress mediante variables que definiremos en el fichero “main.yml” del directorio “vars”.

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, and ABSPATH. You can find more information by visiting
 * {@link https://codex.wordpress.org/Editing_wp-config.php Editing wp-config.php}
 * Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', '{{wordpress_bd}}'); # variable para el nombre de la base de datos de wordpress

/** MySQL database username */
define('DB_USER', '{{wordpress_user}}'); # variable para el usuario de la base de datos de wordpress

/** MySQL database password */
define('DB_PASSWORD', '{{wordpress_pass}}'); # variable para la contraseña de la base de datos de wordpress

/** MySQL hostname */
define('DB_HOST', '{{db_host}}'); # variable para la ip del servidor de base de datos

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

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

/**#@+
 * 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',         'c;u$9x8elk<^jbS}a+*_AQ1y;J!2W@|;{grIBd}jowYuF-tG6H$YjgDUw8_}moPf');
define('SECURE_AUTH_KEY',  '{BCHq8/}%S)X|./7`*R!#Cz/W^&=!KQ&3oB9bFrIZr|_FTEv5AD|,sd9~M~IE9dw');
define('LOGGED_IN_KEY',    'hl]q,CX&q~C-^>B,XL-3fgFG3Pnw$OVhf Syo/,[2vsI(%3/++6{IF!,oQP+0|Vz');
define('NONCE_KEY',        'hni|+1A_IT@HfU(+9=xZd6GQRwmqJ~>-d|P,ofQ3.]K<68!gP#n9}F}U9n4/IA&z');
define('AUTH_SALT',        'wt#T<t1jKIvj;i8TgFRs80+9#0)HRiHpzKW-zCF#V>|g-kNX1)#X`w*6s>F.rx](');
define('SECURE_AUTH_SALT', 'fNy+!%v8[p|fbN[%umD^B~tc-Ory@F&u/z6xV)Sn<} ,p|xIL<XWq}nDw3H{w!xP');
define('LOGGED_IN_SALT',   'voDk#o,ME@D0P<nd2k/jHVN#wt[OVB~wQR_-$.-JSIN?r>IrA!RY{0bjrLUZ#g>0');
define('NONCE_SALT',       '?H58Jtd?w??*w@/YRK!;2<Qm|saMGwk$-[!2=4 $qNDpl1S_s!TIws/}wTV~-QCw');

/**#@-*/

/**
 * 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.
 */
define('WP_DEBUG', false);

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

/** 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');
wordpress.conf.j2

Este fichero lo utilizaremos para configurar el virtualhost de wordpress mediante variables que definiremos en el fichero “main.yml” del directorio “vars”.

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        ServerName {{wordpress_url}} # variable para la url de wordpress

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/wordpress

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

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

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        <Directory /var/www/html/wordpress>
                AllowOverride All
        </Directory>

</VirtualHost>
Playbook para instalar wordpress: Directorio vars

En el directorio “vars” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

db_host: 192.168.50.100 # variable para la ip del servidor de base de datos
mysql_root_user: root # variable para el usuario root de mariadb
mysql_root_pass: root # variable para la contraseña del usuario root de mariadb
wordpress_bd: wordpress-db # variable para el nombre de la base de datos de wordpress
wordpress_user: wordpress # variable para el usuario de la base de datos de wordpress
wordpress_pass: password23 # variable para la contraseña de la base de datos de wordpress
wordpress_url: wordpress.example.local # variable para la url de wordpress

Creamos las variables que utilizaremos para configurar wordpress.

Playbook para instalar wordpress: Directorio tasks

En el directorio “tasks” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: Instalando paquetes
  apt: 
    pkg: 
    - unzip
    - php
    - php-mysql
    - libapache2-mod-php
    - php-curl
    - php-imagick
    - php-intl
    - php-mbstring
    - php-xml
    - php-zip
    - python3-mysqldb
    - mariadb-client
    state: latest
- name: Descargando wordpress
  get_url: url=https://es.wordpress.org/latest-es_ES.tar.gz dest=/root/latest.zip mode=0640
- name: unzip wordpress
  unarchive: src=/root/latest.zip dest=/var/www/html copy=no owner=www-data group=www-data mode=0744

- name: Creando usuario de db para wordpress
  mysql_user:
    login_host: "{{ db_host }}"
    login_user: "{{ mysql_root_user }}"
    login_password: "{{ mysql_root_pass }}"
    name: "{{ wordpress_user }}"
    host: '%'
    password: "{{ wordpress_pass }}"
    priv: "{{ wordpress_bd }}.*:ALL,GRANT"
    state: present

- name: Creando base de datos
  mysql_db: 
    name: "{{ wordpress_bd }}"
    state: present
    login_host: "{{ db_host }}"
    login_user: "{{ wordpress_user }}"
    login_password: "{{ wordpress_pass }}"

- name: Habilitando modulo de apache rewrite
  community.general.apache2_module:
    state: present
    name: rewrite

- name: Configurando virtualhost de wordpress
  template: src=wordpress.conf.j2 dest=/etc/apache2/sites-available/wordpress.conf owner=root group=root mode=0644

- name: Habilitando sitio de wordpress
  command: a2ensite
    wordpress.conf

- name: Configurando wp-config.php
  template: src=wp-config.j2 dest=/var/www/html/wordpress/wp-config.php owner=www-data group=www-data mode=0744
  notify: restart apache2

Este playbook lo que hace es utilizar apt para instalar la ultima version de los paquetes necesarios para wordpress, descargar la ultima version de wordpress, descomprimir wordpress, crear el usuario y la base de datos de wordpress, habilitar el modulo rewrite de apache2, configurar el virtualhost de wordpress y configurar el fichero wp-config.php.

Playbook para instalar nextcloud

Para crear este playbook vamos a crear un directorio llamado “nextcloud” en el directorio “roles” y dentro de este directorio crearemos los directorios “tasks”, “handlers”, “templates” y “vars”.

Playbook para instalar nextcloud: Directorio handlers

En el directorio “handlers” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: restart apache2
  service: name=apache2 state=restarted

Definimos un handler que reiniciara el servicio de apache2.

Playbook para instalar nextcloud: Directorio templates

En el directorio “templates” vamos a crear el fichero “nextcloud.conf.j2” para configurar el virtualhost de nextcloud.

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        ServerName {{nextcloud_url}} # variable para la url de nextcloud

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/nextcloud

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

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

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        <Directory /var/www/html/nextcloud/>
                Options +FollowSymlinks
        AllowOverride All

        <IfModule mod_dav.c>
                Dav off
        </IfModule>

        SetEnv HOME /var/www/html/nextcloud
        SetEnv HTTP_HOME /var/www/html/nextcloud
        </Directory>

</VirtualHost>
Playbook para instalar nextcloud: Directorio vars

En el directorio “vars” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

db_host: 192.168.50.100 # variable para la ip del servidor de base de datos
mysql_root_user: root # variable para el usuario root de mariadb
mysql_root_pass: root # variable para la contraseña del usuario root de mariadb
nextcloud_db: nextcloud-db # variable para el nombre de la base de datos de nextcloud
nextcloud_user: nextcloud # variable para el usuario de la base de datos de nextcloud
nextcloud_pass: password23 # variable para la contraseña de la base de datos de nextcloud
nextcloud_url: nextcloud.example.local # variable para la url de nextcloud

Creamos las variables y asignamos los valores que utilizaremos para crear la base de datos de nextcloud y configurar el virtualhost de nextcloud.

Playbook para instalar nextcloud: Directorio tasks

En el directorio “tasks” vamos a crear un fichero llamado “main.yml” con el siguiente contenido.

- name: Instalando paquetes
  apt: 
    pkg: 
    - unzip
    - curl
    - libapache2-mod-php
    - php
    - php-mysql
    - mariadb-client
    - php-curl
    - php-cli
    - php-gd
    - php-common
    - php-xml
    - php-json
    - php-intl
    - php-pear
    - php-imagick
    - php-dev
    - php-mbstring
    - php-zip
    - php-soap
    - php-bz2
    - php-bcmath
    - php-gmp
    - php-apcu
    - libmagickcore-dev
    - python3-mysqldb
    state: latest
- name: Descargando nextcloud
  get_url: url=https://download.nextcloud.com/server/releases/latest.zip dest=/root/latest.zip mode=0640
- name: unzip nextcloud
  unarchive: src=/root/latest.zip dest=/var/www/html copy=no owner=www-data group=www-data mode=0744

- name: Creando usuario de db para nextcloud
  mysql_user:
    login_host: "{{ db_host }}"
    login_user: "{{ mysql_root_user }}"
    login_password: "{{ mysql_root_pass }}"
    name: "{{ nextcloud_user }}"
    host: '%'
    password: "{{ nextcloud_pass }}"
    priv: "{{ nextcloud_db }}.*:ALL,GRANT"
    state: present

- name: Creando base de datos
  mysql_db: 
    name: "{{ nextcloud_db }}"
    state: present
    login_host: "{{ db_host }}"
    login_user: "{{ nextcloud_user }}"
    login_password: "{{ nextcloud_pass }}"

- name: Configurando virtualhost de nextcloud
  template: src=nextcloud.conf.j2 dest=/etc/apache2/sites-available/nextcloud.conf owner=root group=root mode=0644

- name: Habilitando sitio de nextcloud
  command: a2ensite
    nextcloud.conf
  notify: restart apache2

Este playbook lo que hace es utilizar apt para instalar la ultima version de los paquetes necesarios para nextcloud, descargar la ultima version de nextcloud, descomprimir nextcloud, crear el usuario y la base de datos de nextcloud, configurar el virtualhost de nextcloud y reiniciar el servicio de apache2.

Ejecucion de playbooks

Ya tenemos nuestros playbooks creados, ahora vamos a preparar el entorno para ejecutarlos.

Para ejecutar los playbooks necesitamos lo siguiente:

  • Configurar el fichero hosts.
  • Configurar el fichero site.yml.
  • Una clave privada en nuestro equipo para conectarnos a los nodos.
  • Una clave publica en los nodos en los que vamos a ejecutar los playbooks.
  • un usuario con privilegios de sudo o root en los nodos en los que vamos a ejecutar los playbooks.

La configuracion que mostrare en este post son los ficheros “hosts” y “site.yml”.

Configuracion del fichero hosts

El fichero hosts es el fichero de inventario de ansible, en el vamos a definir los nodos en los que vamos a ejecutar los playbooks.

mariadb ansible_ssh_host=192.168.50.100 ansible_ssh_user=root ansible_ssh_private_key_file=dev_id_rsa
wordpress ansible_ssh_host=192.168.50.101 ansible_ssh_user=root ansible_ssh_private_key_file=dev_id_rsa
nextcloud ansible_ssh_host=192.168.50.102 ansible_ssh_user=root ansible_ssh_private_key_file=dev_id_rsa
  • mariadb: Es el nombre del nodo.
  • ansible_ssh_host: Es la ip del nodo.
  • ansible_ssh_user: Es el usuario con el que nos conectaremos al nodo.
  • ansible_ssh_private_key_file: Es la ruta de la clave privada que utilizaremos para conectarnos al nodo.

En este fichero definimos los nodos “mariadb”, “wordpress” y “nextcloud” con sus respectivas ips, usuarios y claves privadas.

Configuracion del fichero site.yml

El fichero site.yml es el fichero que utilizaremos para ejecutar los playbooks.

- hosts: all
  become: true
  roles:
    - common

- hosts: mariadb
  become: true
  roles:
    - mariadb

- hosts: wordpress
  become: true
  roles:
    - apache2
    - wordpress

- hosts: nextcloud
  become: true
  roles:
    - apache2
    - nextcloud
  • hosts: Es el nodo en el que vamos a ejecutar el playbook.
  • become: Indica que vamos a ejecutar el playbook con privilegios de root.
  • roles: Son los playbooks que vamos a ejecutar en el nodo.

En este fichero ejecutamos el playbook “common” en todos los nodos, el playbook “mariadb” en el nodo “mariadb”, el playbook “apache2” y “wordpress” en el nodo “wordpress” y el playbook “apache2” y “nextcloud” en el nodo “nextcloud”.

Pruena de ejecucion de playbooks

Con todo esto ya podemos ejecutar nuestros playbooks.

Para ejecutar los playbooks utilizaremos el siguiente comando.

root@ansible:~/ansible# ansible-playbook site.yml

salida:

PLAY [all] ****************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************
ok: [wordpress]
ok: [nextcloud]
ok: [mariadb]

TASK [common : Actualización de paquetes] *********************************************************************************************************************************************************************************
changed: [wordpress]
changed: [nextcloud]
changed: [mariadb]

PLAY [mariadb] ************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************
ok: [mariadb]

TASK [mariadb : Instalación de paquetes] **********************************************************************************************************************************************************************************
changed: [mariadb]

TASK [mariadb : Configurando mariadb] *************************************************************************************************************************************************************************************
changed: [mariadb]

TASK [mariadb : Cambiando contraseña root] ********************************************************************************************************************************************************************************
changed: [mariadb]

RUNNING HANDLER [mariadb : restart mariadb] *******************************************************************************************************************************************************************************
changed: [mariadb]

PLAY [wordpress] **********************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************
ok: [wordpress]

TASK [apache2 : Instalando paquete apache2] *******************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Instalando paquetes] ************************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Descargando wordpress] **********************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : unzip wordpress] ****************************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Creando usuario de db para wordpress] *******************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Creando base de datos] **********************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Habilitando modulo de apache rewrite] *******************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Configurando virtualhost de wordpress] ******************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Habilitando sitio de wordpress] *************************************************************************************************************************************************************************
changed: [wordpress]

TASK [wordpress : Configurando wp-config.php] *****************************************************************************************************************************************************************************
changed: [wordpress]

RUNNING HANDLER [wordpress : restart apache2] *****************************************************************************************************************************************************************************
changed: [wordpress]

PLAY [nextcloud] **********************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************
ok: [nextcloud]

TASK [apache2 : Instalando paquete apache2] *******************************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Instalando paquetes] ************************************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Descargando nextcloud] **********************************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : unzip nextcloud] ****************************************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Creando usuario de db para nextcloud] *******************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Creando base de datos] **********************************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Configurando virtualhost de nextcloud] ******************************************************************************************************************************************************************
changed: [nextcloud]

TASK [nextcloud : Habilitando sitio de nextcloud] *************************************************************************************************************************************************************************
changed: [nextcloud]

RUNNING HANDLER [nextcloud : restart apache2] *****************************************************************************************************************************************************************************
changed: [nextcloud]

PLAY RECAP ****************************************************************************************************************************************************************************************************************
mariadb                    : ok=7    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
nextcloud                  : ok=12   changed=10   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
wordpress                  : ok=14   changed=12   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Como podemos ver los playbooks se han ejecutado correctamente.

Vamos a comprobar en nuestro navegador si aparece los instaladores de wordpress y nextcloud.

Wordpress

Como podemos ver en la imagen el instalador de wordpress se muestra correctamente. Tambien podemos ver que no nos pide la configuracion de la base de datos ya que la hemos configurado en el playbook.

wordpress

Nextcloud

Como podemos ver en la imagen el instalador de nextcloud se muestra correctamente. En este caso si nos pide la configuracion de la base de datos ya que no la hemos configurado en el playbook.

nextcloud

Con esto ya hemos creado nuestros playbooks en ansible en debian 10.