Mi Blog

No te olvides seguirme en Facebook.

Tan solo tienes que hacer click en Me Gusta

 

 

x

⋆ Cómo instalar y configurar Ansible en GNU/Linux

⋆ Cómo instalar y configurar Ansible en GNU/Linux

(Tiempo estimado: 20 - 39 minutos)

Automatizar tareas o realizar una misma tarea en miles de servidores, se convierte en tarea un poco más sencilla gracias al potencial que nos ofrece Ansible. Cualquier DevOP de hoy en día, debe tener conocimiento de al menos una herramienta como Ansible ó similar (hay muchas en el mercado). En este tutorial voy a enseñaros como instalar Ansible en GNU/Linux y como realizar los primeros pasos, realizando algunos ejemplos de automatización de tareas, despliegues de configuraciones y explicaré también con ejemplos lo que son los famosos playbooks de Ansible.

Seguid leyendo si queréis aprender a instalar y realizar vuestras primeras tareas con Ansible...

 

 

¿QUÉ ES ANSIBLE?

Ansible es una plataforma de software libre para configurar y administrar ordenadores. Combina instalación multi-nodo (es decir: permite desplegar configuraciones de servidores y servicios por lotes), ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como una herramienta de orquestación. Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior​ para instalarlo). Dispone de módulos que trabajan sobre JSON y la salida estándar puede ser escrita en cualquier lenguaje. Nativamente utiliza YAML para describir configuraciones reusables de los sistemas.

Ventajas:

  • No necesita instalar agentes
  • Sólo se necesita tener instalado Python en los equipos administrados
  • Gran biblioteca pública de módulos para aumentar su funcionalidad

 

 

Ansible es muy utilizado por los DevOPs

 

 

1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL

  • Un equipo con GNU/Linux Debian
  • Al menos otro equipo con GNU/Linux
  • Conexión a Internet (muy recomendado)

 

 

2.- ESQUEMA DE LA RED

Para este tutorial usaré 3 equipos, y cada uno de esos equipos pertenece a un grupo. Dentro de cada grupo, se pueden tener entre 1 o N equipos. El esquema de red para el siguiente tutorial es el siguiente:

Instalar AnsibleEsquema de red

 

 

3.- INSTALACIÓN DE ANSIBLE

La instalación de Ansible es muy sencilla. Primero será necesario instalar Python en el servidor donde instalemos Ansible con los siguientes comandos:

raul@ansible-server:~ sudo apt-get update
raul@ansible-server:~ sudo apt-get install -y python-minimal

 

 

Y para instalar Ansible ejecutaremos los siguientes comandos:

raul@ansible-server:~ sudo apt-get install software-properties-common
raul@ansible-server:~ sudo apt-add-repository --yes --update ppa:ansible/ansible
raul@ansible-server:~ sudo apt-get install ansible

 

 

Por seguridad, se recomienda tener un usuario específico para usar con Ansible en lugar de utilizar el usuario root. En el servidor de ansible, crearemos el usuario ansible con el siguiente comando:

raul@ansible-server:~ sudo adduser ansible
Añadiendo el usuario `ansible' ...
Añadiendo el nuevo grupo `ansible' (1001) ...
Añadiendo el nuevo usuario `ansible' (1001) con grupo `ansible' ...
Creando el directorio personal `/home/ansible' ...
Copiando los ficheros desde `/etc/skel' ...
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para ansible
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
Nombre completo []:
Número de habitación []:
Teléfono del trabajo []:
Teléfono de casa []:
Otro []:
¿Es correcta la información? [S/n] S

 

 

4.- CONFIGURANDO EL INVENTARIO DE MÁQUINAS

En el servidor donde hemos instalado Ansible, es necesario configurar todos los hosts que serán orquestados por Ansible. Los equipos o nodos clientes, podrán ser agrupados en grupos. En este ejemplo, solamente se dispone de 3 equipos: el nodo servidor y dos equipos clientes. Cada uno de estos equipos pertenece a uno grupo. El equipo 1 pertenece al grupo webservers, el equipo 2 pertenece al grupo ftpservers y el servidor de ansible al grupo ansibleserver. El fichero que hay que editar es /etc/ansible/hosts y el agruparemos los nodos y grupos de la siguiente forma:

[ansibleserver]
172.26.1.138

[webservers]
172.26.1.142

[ftpservers]
172.26.1.120

 

 

5.- CONFIGURACIÓN DE LOS NODOS CLIENTES

En los equipos clientes, solo es necesario instalar el servidor de SSH y Python. Con el siguiente comando se instalarán ambas cosas:

ansible-client1:

raul@ansible-client1:~ sudo apt-get update
raul@ansible-client1:~ sudo apt-get install -y python-minimal openssh-server

 

 

ansible-client2:

raul@ansible-client2:~ sudo apt-get update
raul@ansible-client2:~ sudo apt-get install -y python-minimal openssh-server

 

 

Por seguridad, se recomienda tener un usuario específico para usar con Ansible en lugar del usuario root en los nodos clientes. En todas las máquinas que queramos gestionar, crearemos el usuario ansible con el siguiente comando:

ansible-client1:

raul@ansible-client1:~ sudo adduser ansible
Añadiendo el usuario `ansible' ...
Añadiendo el nuevo grupo `ansible' (1001) ...
Añadiendo el nuevo usuario `ansible' (1001) con grupo `ansible' ...
Creando el directorio personal `/home/ansible' ...
Copiando los ficheros desde `/etc/skel' ...
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para ansible
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
Nombre completo []:
Número de habitación []:
Teléfono del trabajo []:
Teléfono de casa []:
Otro []:
¿Es correcta la información? [S/n] S

 

 

ansible-client2:

raul@ansible-client2:~ sudo adduser ansible
Añadiendo el usuario `ansible' ...
Añadiendo el nuevo grupo `ansible' (1001) ...
Añadiendo el nuevo usuario `ansible' (1001) con grupo `ansible' ...
Creando el directorio personal `/home/ansible' ...
Copiando los ficheros desde `/etc/skel' ...
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para ansible
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
Nombre completo []:
Número de habitación []:
Teléfono del trabajo []:
Teléfono de casa []:
Otro []:
¿Es correcta la información? [S/n] S

 

 

 

 

6.- GENERACIÓN Y CONFIGURACIÓN DE LLAVES DE SSH

La comunicación entre el servidor de Ansible y los nodos clientes, se hace a través de SSH. Para que todo funcione correctamente, es necesario configurar SSH con soporte de llave pública/privada para evitar que tengamos que introducir la contraseña cuando accedamos a los nodos clientes a través de Ansible.

En el servidor de Ansible, generaremos tanto la llave publica y privada para el usuario ansible. Ejecutaremos el siguiente comando con el usuario ansible:

ansible@ansible-server:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa):
Created directory '/home/ansible/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:sHtjgLAPaD/zz2ZP6+vZ+qgA6YOpN2DD+p2xZsOvLyI ansible@ansible-server
The key's randomart image is:
+---[RSA 2048]----+
| |
| |
| . . |
| . o.. o |
|o.oo. o S |
|o+=o. o |
|o+.Bo.. +. |
|E +.@+o=..= |
|.+.==B*+=X+o |
+----[SHA256]-----+

 

 

Ahora, la llave pública del usuario ansible en el servidor de Ansible, debe copiarse a todas las máquinas clientes. Para copiarlo hay que ejecutar el siguiente comando:

Copiar a ansible-client1:

ansible@ansible-server:~$ ssh-copy-id Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub"
The authenticity of host '172.26.1.142 (172.26.1.142)' can't be established.
ECDSA key fingerprint is SHA256:Gav+IlyXHLONUwQO1KfMp+CYG06zv9ygfmO3BRnU30U.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.'s password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.'"
and check to make sure that only the key(s) you wanted were added.

 

 

Copiar a ansible-client2:

ansible@ansible-server:~$ ssh-copy-id Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub"
The authenticity of host '172.26.1.120 (172.26.1.120)' can't be established.
ECDSA key fingerprint is SHA256:9CLbqHoAVp51xe+Kw8EBgBvvXUmMHytL3eocF8f2GMI.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.'s password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.'"
and check to make sure that only the key(s) you wanted were added.

 

 

Si queremos que el usuario ansible pueda hacer sudo (tener privilegios de root) en las máquinas clientes para por instalar software, borrar software, reiniciar servicios... debemos instalar el paquete sudo y luego con el comando visudo, añadir el usuario ansible:

Instalación del paquete sudo en los nodos clientes:

raul@ansible-server:~ sudo apt-get install sudo

 

 

A continuación, con el comando visudo añadimos el usuario ansible tal y como se muestra en la siguientes líneas:

# User privilege specification
root ALL=(ALL:ALL) ALL
ansible ALL=(ALL:ALL) NOPASSWD: ALL

 

 

7.- COMPROBACIÓN DE LOS NODOS CLIENTES

Una vez que tenemos todos los pasos anteriores completados, podremos comprobar si la comunicación es correcta con todos los nodos gestionados lanzando el siguiente comando:

ansible@ansible-server:~$ ansible all -m ping
172.26.1.120 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.26.1.138 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.26.1.142 | SUCCESS => {
"changed": false,
"ping": "pong"
}
 

 

 

8.- EJEMPLO - INSTALACIÓN DE PAQUETES

En este ejemplo, lo que vamos a hacer es instalar un paquete debian (joe) en todos los servidores gestionados. Para instalar el programa joe en todos los equipos gestionados por ansible, incluido el servidor Ansible, ejecutaremos lo siguiente:

ansible@ansible-server:~$ ansible all -m shell -a "apt install joe -y" --become
172.26.1.142 | SUCCESS | rc=0 >>
Leyendo lista de paquetes...
Creando árbol de dependencias...
Leyendo la información de estado...
Se instalarán los siguientes paquetes NUEVOS:
joe
0 actualizados, 1 nuevos se instalarán, 0 para eliminar y 58 no actualizados.
Se necesita descargar 0 B/524 kB de archivos.
Se utilizarán 2.058 kB de espacio de disco adicional después de esta operación.
Seleccionando el paquete joe previamente no seleccionado.
(Leyendo la base de datos ... 27018 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../archives/joe_4.4-1_i386.deb ...
Desempaquetando joe (4.4-1) ...
Configurando joe (4.4-1) ...
update-alternatives: utilizando /usr/bin/joe para proveer /usr/bin/editor (editor) en modo automático
Procesando disparadores para man-db (2.7.6.1-2) ...
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

172.26.1.138 | SUCCESS | rc=0 >>
Leyendo lista de paquetes...
Creando árbol de dependencias...
Leyendo la información de estado...
Se instalarán los siguientes paquetes NUEVOS:
joe
0 actualizados, 1 nuevos se instalarán, 0 para eliminar y 53 no actualizados.
Se necesita descargar 524 kB de archivos.
Se utilizarán 2.058 kB de espacio de disco adicional después de esta operación.
Des:1 http://ftp.debian.org/debian stretch/main i386 joe i386 4.4-1 [524 kB]
Descargados 524 kB en 6s (80,7 kB/s)
Seleccionando el paquete joe previamente no seleccionado.
(Leyendo la base de datos ... 29151 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../archives/joe_4.4-1_i386.deb ...
Desempaquetando joe (4.4-1) ...
Configurando joe (4.4-1) ...
update-alternatives: utilizando /usr/bin/joe para proveer /usr/bin/editor (editor) en modo automático
Procesando disparadores para man-db (2.7.6.1-2) ...
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

172.26.1.120 | SUCCESS | rc=0 >>
Leyendo lista de paquetes...
Creando árbol de dependencias...
Leyendo la información de estado...
Se instalarán los siguientes paquetes NUEVOS:
joe
0 actualizados, 1 nuevos se instalarán, 0 para eliminar y 58 no actualizados.
Se necesita descargar 524 kB de archivos.
Se utilizarán 2.058 kB de espacio de disco adicional después de esta operación.
Des:1 http://ftp.debian.org/debian stretch/main i386 joe i386 4.4-1 [524 kB]
Descargados 524 kB en 18s (27,7 kB/s)
Seleccionando el paquete joe previamente no seleccionado.
(Leyendo la base de datos ... 27018 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../archives/joe_4.4-1_i386.deb ...
Desempaquetando joe (4.4-1) ...
Configurando joe (4.4-1) ...
update-alternatives: utilizando /usr/bin/joe para proveer /usr/bin/editor (editor) en modo automático
Procesando disparadores para man-db (2.7.6.1-2) ...
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

 

 

Si queremos instalar solamente joe en los nodos de un grupo, ejecutaremos por lo siguiente:

ansible@ansible-server:~$ ansible webservers -m shell -a "apt install apache2 -y" --become
172.26.1.142 | SUCCESS | rc=0 >>
Leyendo lista de paquetes...
Creando árbol de dependencias...
Leyendo la información de estado...
Se instalarán los siguientes paquetes adicionales:
apache2-bin apache2-data apache2-utils libapr1 libaprutil1
libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.2-0 ssl-cert
Paquetes sugeridos:
www-browser apache2-doc apache2-suexec-pristine | apache2-suexec-custom
openssl-blacklist
Se instalarán los siguientes paquetes NUEVOS:
apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1
libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.2-0 ssl-cert
0 actualizados, 10 nuevos se instalarán, 0 para eliminar y 58 no actualizados.
Se necesita descargar 2.261 kB de archivos.
Se utilizarán 7.039 kB de espacio de disco adicional después de esta operación.
Des:1 http://ftp.debian.org/debian stretch/main i386 libapr1 i386 1.5.2-5 [106 kB]
Des:2 http://ftp.debian.org/debian stretch/main i386 libaprutil1 i386 1.5.4-3 [92,3 kB]
Des:3 http://ftp.debian.org/debian stretch/main i386 libaprutil1-dbd-sqlite3 i386 1.5.4-3 [19,5 kB]
Des:4 http://ftp.debian.org/debian stretch/main i386 libaprutil1-ldap i386 1.5.4-3 [17,6 kB]
Des:5 http://ftp.debian.org/debian stretch/main i386 liblua5.2-0 i386 5.2.4-1.1+b2 [123 kB]
Des:6 http://ftp.debian.org/debian stretch/main i386 apache2-bin i386 2.4.25-3+deb9u9 [1.260 kB]
Des:7 http://ftp.debian.org/debian stretch/main i386 apache2-utils i386 2.4.25-3+deb9u9 [223 kB]
Des:8 http://ftp.debian.org/debian stretch/main i386 apache2-data all 2.4.25-3+deb9u9 [162 kB]
Des:9 http://ftp.debian.org/debian stretch/main i386 apache2 i386 2.4.25-3+deb9u9 [237 kB]
Des:10 http://ftp.debian.org/debian stretch/main i386 ssl-cert all 1.0.39 [20,8 kB]
Preconfigurando paquetes ...
Descargados 2.261 kB en 42s (53,8 kB/s)
Seleccionando el paquete libapr1:i386 previamente no seleccionado.
(Leyendo la base de datos ... 27132 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../0-libapr1_1.5.2-5_i386.deb ...
Desempaquetando libapr1:i386 (1.5.2-5) ...
Seleccionando el paquete libaprutil1:i386 previamente no seleccionado.
Preparando para desempaquetar .../1-libaprutil1_1.5.4-3_i386.deb ...
Desempaquetando libaprutil1:i386 (1.5.4-3) ...
Seleccionando el paquete libaprutil1-dbd-sqlite3:i386 previamente no seleccionado.
Preparando para desempaquetar .../2-libaprutil1-dbd-sqlite3_1.5.4-3_i386.deb ...
Desempaquetando libaprutil1-dbd-sqlite3:i386 (1.5.4-3) ...
Seleccionando el paquete libaprutil1-ldap:i386 previamente no seleccionado.
Preparando para desempaquetar .../3-libaprutil1-ldap_1.5.4-3_i386.deb ...
Desempaquetando libaprutil1-ldap:i386 (1.5.4-3) ...
Seleccionando el paquete liblua5.2-0:i386 previamente no seleccionado.
Preparando para desempaquetar .../4-liblua5.2-0_5.2.4-1.1+b2_i386.deb ...
Desempaquetando liblua5.2-0:i386 (5.2.4-1.1+b2) ...
Seleccionando el paquete apache2-bin previamente no seleccionado.
Preparando para desempaquetar .../5-apache2-bin_2.4.25-3+deb9u9_i386.deb ...
Desempaquetando apache2-bin (2.4.25-3+deb9u9) ...
Seleccionando el paquete apache2-utils previamente no seleccionado.
Preparando para desempaquetar .../6-apache2-utils_2.4.25-3+deb9u9_i386.deb ...
Desempaquetando apache2-utils (2.4.25-3+deb9u9) ...
Seleccionando el paquete apache2-data previamente no seleccionado.
Preparando para desempaquetar .../7-apache2-data_2.4.25-3+deb9u9_all.deb ...
Desempaquetando apache2-data (2.4.25-3+deb9u9) ...
Seleccionando el paquete apache2 previamente no seleccionado.
Preparando para desempaquetar .../8-apache2_2.4.25-3+deb9u9_i386.deb ...
Desempaquetando apache2 (2.4.25-3+deb9u9) ...
Seleccionando el paquete ssl-cert previamente no seleccionado.
Preparando para desempaquetar .../9-ssl-cert_1.0.39_all.deb ...
Desempaquetando ssl-cert (1.0.39) ...
Configurando libapr1:i386 (1.5.2-5) ...
Configurando apache2-data (2.4.25-3+deb9u9) ...
Configurando ssl-cert (1.0.39) ...
Procesando disparadores para libc-bin (2.24-11+deb9u1) ...
Configurando libaprutil1:i386 (1.5.4-3) ...
Procesando disparadores para systemd (232-25+deb9u11) ...
Procesando disparadores para man-db (2.7.6.1-2) ...
Configurando liblua5.2-0:i386 (5.2.4-1.1+b2) ...
Configurando libaprutil1-ldap:i386 (1.5.4-3) ...
Configurando libaprutil1-dbd-sqlite3:i386 (1.5.4-3) ...
Configurando apache2-utils (2.4.25-3+deb9u9) ...
Configurando apache2-bin (2.4.25-3+deb9u9) ...
Configurando apache2 (2.4.25-3+deb9u9) ...
Enabling module mpm_event.
Enabling module authz_core.
Enabling module authz_host.
Enabling module authn_core.
Enabling module auth_basic.
Enabling module access_compat.
Enabling module authn_file.
Enabling module authz_user.
Enabling module alias.
Enabling module dir.
Enabling module autoindex.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module filter.
Enabling module deflate.
Enabling module status.
Enabling module reqtimeout.
Enabling conf charset.
Enabling conf localized-error-pages.
Enabling conf other-vhosts-access-log.
Enabling conf security.
Enabling conf serve-cgi-bin.
Enabling site 000-default.
Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service.
Created symlink /etc/systemd/system/multi-user.target.wants/apache-htcacheclean.service → /lib/systemd/system/apache-htcacheclean.service.
Procesando disparadores para libc-bin (2.24-11+deb9u1) ...
Procesando disparadores para systemd (232-25+deb9u11) ...
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

 

 

9.- EJEMPLO - DESINSTALACIÓN DE PAQUETES

La desinstalación de paquetes es muy similar a la instalación, solamente hay que cambiar el comando a ejecutar. Para desinstalar el programa joe en todos los equipos gestionados por ansible, incluido el servidor Ansible, ejecutaremos lo siguiente

ansible@ansible-server:~$ ansible all -m shell -a "apt remove joe -y" --become

 

 

Si queremos desinstalar en todos los nodos de un grupo, ejecutaremos lo siguiente:

ansible@ansible-server:~$ ansible webservers -m shell -a "apt remove apache2 -y" --become

 

 

10.- EJEMPLO - GESTIONANDO SERVICIOS

Para gestionar los servicios de los nodos, se utiliza también el modulo de shell. Para reiniciar el servicio de NTP en todos los nodos lanzaremos el siguiente comando:

ansible@ansible-server:~$ ansible all -m shell -a "service ntp restart" --become
172.26.1.138 | SUCCESS | rc=0 >>
172.26.1.142 | SUCCESS | rc=0 >>
172.26.1.120 | SUCCESS | rc=0 >>

 

 

Si queremos reiniciar el servicio de Apache en los nodos del grupo webservers, ejecutaremos:

ansible@ansible-server:~$ ansible webservers -m shell -a "service apache2 restart" --become
172.26.1.142 | SUCCESS | rc=0 >>

 

 

Si queremos reiniciar el servicio de ProFTPd en los nodos del grupo ftpservers, ejecutaremos:

ansible@ansible-server:~$ ansible ftpservers -m shell -a "service proftpd stop" --become
172.26.1.120 | SUCCESS | rc=0 >>

 

  

11.- EJEMPLO - COPIANDO FICHEROS A LOS NODOS

También podemos copiar ficheros a todos los nodos con un solo comando. Por ejemplo, en este ejemplo, copiaremos el fichero vmlinuz-4.9.0-4-686-pae desde el servidor de Ansible al directorio /tmp de todos los nodos gestionados:

ansible@ansible-server:~$ ansible all -m copy -a "src=/boot/vmlinuz-4.9.0-4-686-pae dest=/tmp/" --become
172.26.1.142 | SUCCESS => {
"changed": true,
"checksum": "61ffe7ec81d3b03466a1099361cd394aecedb603",
"dest": "/tmp/vmlinuz-4.9.0-4-686-pae",
"gid": 1001,
"group": "ansible",
"md5sum": "08bcf6b4d9736219e02f62d228f6be76",
"mode": "0644",
"owner": "ansible",
"size": 3643984,
"src": "/home/ansible/.ansible/tmp/ansible-tmp-1582147399.15-174826369601324/source",
"state": "file",
"uid": 1001
}
172.26.1.120 | SUCCESS => {
"changed": true,
"checksum": "61ffe7ec81d3b03466a1099361cd394aecedb603",
"dest": "/tmp/vmlinuz-4.9.0-4-686-pae",
"gid": 1001,
"group": "ansible",
"md5sum": "08bcf6b4d9736219e02f62d228f6be76",
"mode": "0644",
"owner": "ansible",
"size": 3643984,
"src": "/home/ansible/.ansible/tmp/ansible-tmp-1582147399.56-150027950109600/source",
"state": "file",
"uid": 1001
}
172.26.1.138 | SUCCESS => {
"changed": true,
"checksum": "61ffe7ec81d3b03466a1099361cd394aecedb603",
"dest": "/tmp/vmlinuz-4.9.0-4-686-pae",
"gid": 1001,
"group": "ansible",
"md5sum": "08bcf6b4d9736219e02f62d228f6be76",
"mode": "0644",
"owner": "ansible",
"size": 3643984,
"src": "/home/ansible/.ansible/tmp/ansible-tmp-1582147399.37-158329314924727/source",
"state": "file",
"uid": 1001
}

 

 

12.- PLAYBOOKS

Los playbooks nos proporcionan una forma diferente de trabajar y utilizar Ansible en nuestro día a día. Los comandos sencillos podemos lanzarlos de forma ad-hoc, pero gracias a los playbooks, convertiremos a Ansible en una herramienta muchísimo más potente. Al estar guardados los playbooks en ficheros, dichos playbooks pueden estar versionados en un repositorio como Git, y de esta forma tener un control mucho mayor de los cambios que hagamos en ellos. Los ficheros playbooks utilizan el formato YML.

Un playbook se compone de varios plays y no es mas que una agrupación de comandos, hosts, tareas etc ... en un único fichero YAML y que será leído y ejecutado por Ansible.

Es posible orquestar muchas máquinas al mismo tiempo con los plays de Ansible gracias a la agrupación de los nodos en los inventarios de Ansible.

A continuación muestro un ejemplo de un playbook que se encarga de actualizar todos los equipos de webserveres y ftpservers. Los Playbooks son sumamente potentes y tienen infinidad de opciones. A continuación se muestra un pequeño ejemplo, pero hay infinidad de módulos y opciones que se pueden ver en https://docs.ansible.com/

---
# Este playbook actualiza los sistemas operativos y reinicia servidores web

- hosts: webservers
tasks:
- name: Reiniciar todos los servidores Web
service:
name: apache2
state: restarted
become: yes

- hosts: ftpservers
tasks:
- name: Actualizar cache de todos los servidores ftpservers
apt:
update_cache: yes
become: yes

 

 

Si ejecutamos el playbook de pruebas:

ansible@ansible-server:~$ ansible-playbook playbook_pruebas-yaml

 

 

Obtendremos la siguiente salida:

PLAY [webservers] **************************************************************

TASK [setup] *******************************************************************
ok: [172.26.1.142]

TASK [Reiniciar todos los servidores Web] **************************************
changed: [172.26.1.142]

PLAY [ftpservers] **************************************************************

TASK [setup] *******************************************************************
ok: [172.26.1.120]

TASK [Actualizar cache todos los servidores ftpservers] ***********************
fatal: [172.26.1.120]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find aptitude. Please ensure it is installed."}
to retry, use: --limit @/home/ansible/playbook_pruebas.retry

PLAY RECAP *********************************************************************
172.26.1.120 : ok=1 changed=0 unreachable=0 failed=1
172.26.1.142 : ok=2 changed=1 unreachable=0 failed=0

 

 

Si arreglamos el problema del nodo 172.26.1.120 instalando aptitude y volvemos a lanzar el playbook, veremos que todo funciona correctamente:

PLAY [webservers] **************************************************************

TASK [setup] *******************************************************************
ok: [172.26.1.142]

TASK [Reiniciar todos los servidores Web] **************************************
changed: [172.26.1.142]

PLAY [ftpservers] **************************************************************

TASK [setup] *******************************************************************
ok: [172.26.1.120]

TASK [Actualizar cache todos los servidores ftpservers] ***********************
changed: [172.26.1.142]

PLAY RECAP *********************************************************************
172.26.1.120 : ok=1 changed=1 unreachable=0 failed=0
172.26.1.142 : ok=2 changed=1 unreachable=0 failed=0

 

 

ENJOY!


Raúl Prieto Fernández

Sitio Web: raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

Escribir un comentario

Código de seguridad
Refescar