Creación de playbooks con ansible en Debian 12
¿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.
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.
Con esto ya hemos creado nuestros playbooks en ansible en debian 10.