Cómo instalar y configurar Ansible en Ubuntu 20.04

Ansible es una herramienta de gestión de la configuración muy popular, diseñada para agilizar el proceso de control de un gran número de servidores. Puedes controlar tantos servidores como quieras y ejecutar procesos en ellos simultáneamente desde un único nodo.

Ansible no requiere instalar ningún software especial en los nodos del servidor y puede controlarlos a través de SSH.

En esta guía aprenderemos a instalar y configurar Ansible en un servidor Ubuntu 20.04.

Requisitos previos

  • Dos o más sistemas servidores basados en Ubuntu 20.04 con el servidor OpenSSH instalado.
  • Tanto el servidor como los nodos son accesibles a través de direcciones IP públicas.
  • Un usuario no root con privilegios sudo configurado en el servidor Ansible y un usuario root con contraseña configurado en los clientes Ansible.

Instalar Ansible

El repositorio oficial de Ansible no es compatible con Ubuntu 20.04 debido a un error en la biblioteca python de Ubuntu en el momento de escribir este tutorial.

Afortunadamente, Ubuntu incluye Ansible 2.9, que es lo que vamos a instalar. Ejecuta el siguiente comando para instalar Ansible.

$ sudo apt install ansible -y

Prueba la instalación ejecutando el siguiente comando.

$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/username/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

Configurar el archivo de inventario

Para poder conectarte a varios hosts, necesitas un archivo que registre los detalles de los nodos. Este archivo se llama Archivo de Inventario.

Dependiendo del número de servidores que quieras controlar, el archivo de Inventario de Ansible también te permite organizarlos en grupos y subgrupos. También puedes establecer variables personalizadas aplicables a determinados hosts o grupos, que pueden utilizarse posteriormente al transmitir las instrucciones.

Ansible incluye un archivo de Inventario por defecto disponible en /etc/ansible/hosts. Ábrelo con el editor Nano.

$ sudo nano /etc/ansible/hosts

Pega el siguiente código al final del archivo.

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113

[all:vars]
ansible_python_interpreter=/usr/bin/python3

La sección servers define la lista de nodos a los que quieres conectarte. Puedes crear tantos grupos como servidores quieras organizar en varios grupos.

El grupo all:vars establece el parámetro ansible_python_interpreter en todos los hosts del inventario. Asegura que Ansible utiliza el ejecutable Python 3 en lugar de Python 2, que se ha eliminado de las versiones recientes de Ubuntu.

Cuando hayas terminado, guarda y cierra el archivo pulsando CTRL+X y después Y y ENTER para confirmar los cambios.

Nota: También puedes crear tu propio archivo de Inventario en cualquier ubicación de tu elección, que luego puedes pasar utilizando el parámetro -i al ejecutar los comandos de Ansible.

Puedes comprobar tu lista de inventario mediante el siguiente comando.

$ ansible-inventory --list -y
all:
  children:
    servers:
      hosts:
        server1:
          ansible_host: 203.0.113.111
          ansible_python_interpreter: /usr/bin/python3
        server2:
          ansible_host: 203.0.113.112
          ansible_python_interpreter: /usr/bin/python3
        server3:
          ansible_host: 203.0.113.113
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

Organizar servidores en grupos y subgrupos

Este es un consejo útil si tienes muchos servidores y algunos realizan funciones específicas. Por ejemplo, puedes utilizar este método para agrupar servidores web y servidores de bases de datos por separado. Incluso puedes hacer que un host forme parte de varios grupos. Incluso puedes hacer que un host forme parte de varios grupos. Para ello, tu archivo de inventario debe tener un aspecto similar al siguiente.

[webservers]
203.0.113.111
203.0.113.112

[dbservers]
203.0.113.113
server_hostname

[development]
203.0.113.111
203.0.113.113

[production]
203.0.113.112
server_hostname

Configurar claves SSH

Para que Ansible pueda conectarse a los servidores, debes configurar claves SSH entre tu servidor Ansible y los hosts especificados en el archivo de inventario. Esto sólo funcionará si los clientes de Ansible no tienen activada una clave pública y tienen activada una cuenta root con contraseña.

Sigue los pasos siguientes para crear y configurar una clave SSH para Ansible y sus nodos.

Crea la clave para Ansible.

$ ssh-keygen -t rsa -b 4096 -C "Ansible key"

Copia la clave pública en tus cuentas de los servidores remotos. Para ello, utilizaremos el comando ssh-copy-id.

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

Eso es todo. Ahora Ansible debería poder hablar con tus servidores.

Configurar claves SSH en nodos con clave pública existente

Si los clientes ya tienen claves públicas habilitadas, tendrás que seguir ciertos pasos adicionales. Para ello, necesitas crear un nuevo usuario -accesible sólo por Ansible- en cada nodo servidor. Ese usuario tendrá privilegios sudo accesibles sin contraseña y sólo se podrá acceder a él desde tu servidor ansible.

Para crear un usuario ansible, ejecuta el siguiente comando.

$ sudo adduser ansible

Elige una contraseña segura y deja los demás campos vacíos.

Ahora, configura el acceso sudo sin contraseña a este usuario mediante el siguiente comando.

$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

Ahora que tienes el nuevo usuario añadido y configurado, puedes copiar la clave SSH de tu servidor ansible al servidor nodo mediante el siguiente comando.

$ ssh-copy-id [email protected]

Se te pedirá una contraseña para el usuario ansible. Introdúcela y se copiará la clave SSH.

A continuación, desactiva el inicio de sesión basado en contraseña para el usuario ansible en el servidor de nodos.

$ sudo usermod -L ansible

Ahora, tu servidor de nodos sólo es accesible desde el servidor de Ansible, ya que sólo ese servidor tiene la clave pública para él, y no puedes utilizarlo con privilegios sudo en el servidor de nodos directamente, ya que el inicio de sesión con contraseña está desactivado.

Tendrás que repetir estos pasos para cada servidor de nodos. Además, sustituye el usuario root por el usuario ansible en este tutorial.

Prueba de conexión

Después de configurar el archivo de inventario y las claves SSH, debemos comprobar si Ansible es capaz de conectarse a los servidores.

Escribe el siguiente comando para comprobar la conexión. Este comando probará la conexión con todos los servidores del archivo de inventario.

$ ansible all -m ping -u root

Este comando utiliza el módulo ping de Ansible para ejecutar una prueba de conectividad en todos los servidores. Deberías obtener una salida como la siguiente.

server1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Si es la primera vez que utilizas Ansible, se te pedirá que confirmes la autenticidad de todos los servidores. Cuando se te pida, escribe yes y pulsa ENTER para confirmar.

Ejecuta algunos comandos básicos

Vamos a ejecutar algunos comandos básicos en los servidores utilizando Ansible. Para ejecutar cualquier comando en el servidor, se utiliza el siguiente formato.

$ ansible all -a "command" -u <username>

Comprobar el uso del disco

En primer lugar, comprobemos el uso del disco en todos nuestros servidores.

$ ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

Dirigirnos a hosts individuales y grupos

Hasta ahora, ejecutábamos comandos en todos los servidores remotos a la vez. Pero no siempre es así. Para ejecutar un comando en un solo servidor, debes utilizar el siguiente formato.

$ ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
 21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

El comando anterior comprueba el tiempo de actividad en el servidor1 del grupo de inventario.

También puedes dirigirte a varios servidores utilizando el siguiente formato.

$ ansible server1:server2 -m ping -u root

También puedes seleccionar grupos o subgrupos directamente desde el archivo de inventario.

$ ansible groupname -m ping -u <username>

Actualizar todos los servidores

Para este tutorial, supondremos que todos los servidores remotos ejecutan el SO Debian o Ubuntu.

Ejecuta el siguiente comando para actualizar el software de todos tus servidores.

$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

-m parameter define el módulo que Ansible debe ejecutar. -a se refiere a los argumentos o comandos del módulo asociado. Aquí, estamos utilizando el módulo apt de Ansible para actualizar los servidores, igual que utilizamos el módulo ping en nuestro último ejemplo. update_cache actualiza la caché APT en el servidor y upgrade=yes indica a Ansible que ejecute el comando apt upgrade.

Para actualizar tus servidores CentOS, puedes utilizar el mismo comando sustituyendo apt por yum y para los servidores Fedora, puedes sustituir apt por dnf.

Si utilizas el usuario ansible como se ha documentado anteriormente, tienes que modificar el comando ansible para que se ejecute con privilegios sudo elevados.

$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

Aquí, -K te pide la contraseña de elevación de privilegios. -b ejecuta la operación ansible con become, que te permite ser otro usuario. Ambas variables combinadas permiten que ansible se ejecute con privilegios sudo elevados. Tendrás que utilizar esto para todos los comandos que requieran privilegios sudo.

A veces, algunos de estos comandos de actualización pueden requerir un reinicio, así que ejecuta el siguiente comando para reiniciar todos tus servidores.

$ ansible all -a "reboot" -u root

Estos son sólo algunos de los comandos básicos que puedes ejecutar con Ansible.

Conclusión

Con esto terminamos nuestro tutorial sobre la instalación y configuración de Ansible en un servidor basado en Ubuntu 20.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...