Ansible: instalación en Ubuntu 20.04 / Raspberry PI OS

En esta entrada voy a documentar el procedimiento de instalación y configuración básica de Ansible.

Esta aplicación va a tener su propia sección donde pueden encontrar todos las entradas relacionadas en este link.

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.1​ Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior2​) 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.3

(Extraído de wikipedia)

Instalación de Ansible:

Ansible se encuentra como paquete en la distribución, el procedimiento de instalación es el de siempre, actualizar el sistema primero y después desplegar la nueva herramienta.

Como Ansible en un proyecto en relativamente joven las distribuciones de Linux tienen empaquetadas versiones algo viejas. El conocimiento colectivo recomienda instalarlas desde repositorios alternativos.

sudo apt update
sudo apt full-upgrade

En Ubuntu 18.04 / 20.04:

sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible

En Raspberry PI OS (Buster):

echo 'deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main' | sudo tee -a /etc/apt/sources.list.d/ppa-ansible.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367

Todos:

sudo apt install ansible
Captura de pantalla de instalación de Ansible en Raspberry PI OS

A continuación vamos a empezar con la configuración inicial de servidor. Esto se hace definiendo los hosts con los que vamos a trabajar. En este ejemplo doy de alta mi servidor «alphaprime.sismonda.local». En mi caso mi equipo resuelve los nombre de los equipos, se pueden poner direcciones ip como está en los ejemplos de la documentación.

sudo vi /etc/ansible/hosts
Captura de pantalla de incorporación de elementos en el archivo /etc/ansible/hosts.

Ansible depende del ssh para poder ejecutar acciones en los equipos de la infraestructura. Como protocolo voy a crear un usuario para ejecutar estas acciones y voy a permitir que a los clientes solo se conecte con llaves ssh.

En el servidor anfitrión voy a generar el usuario ansible y después voy a generar una llave ssh.

Creo el usuario

sudo adduser --disabled-password --shell /bin/bash --gecos "Ansible User" --ingroup sudo --ingroup ansible ansible
echo 'ansible ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers.d/ansible

Creo la llave SSH RSA para el usuario «ansible».

sudo su - ansible
ssh-keygen
Captura de pantalla con la creación de la llave SSH RSA

Finalizada la creación de la llave SSH RSA necesitamos copiar el valor de la llave pública. La llave pública es un string de una línea que se muestra en varias por la longitud de la misma.

cat /home/ansible/.ssh/id_rsa.pub
Captura de pantalla de llave pública SSH RSA

Y el valor que guardo porque tengo que usarlo en los clientes es:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3S0TKsUWDvmyEdz0/YRcOdVKW4wWniYRhEcX+JH1BIn47ovk4mLZmgv7TCS8Bn0wN6JFXL/KQR60pKVnTfe5FG9LYiiLln3EdinGFwuEJv9XSp/w8uR5SeHUpdQQT3PjyV+Zr9SxDTXRMQB16ZJLMQAltrIHlpucvw56qX4HVNLPUcSCh4cGhSZDbRzRg7OXvZ1ASImc2jOAKHS3XLybXKM9ZhMZ8WxGyv0/e0dik6aEyyAP1Ks7pQfFvr7YbdiPd8/3yivs6dQgveMLBOSl0szPr04zvot6VzKMs5sw8oPDIWgZ5fjiHsVaSCVJT80XFUeq7CNUnj3dSqlc51n/r ansible@rbpi3-001

Este dato es único para cada cliente, se los muestro a modo de ejemplo.

Configuración de clientes Ansible:

Ahora en los clientes tenemos que crear el usuario Ansible en el cliente y configurar todo para que pueda recibir y ejecutar las sentencias. Este procedimiento implica la ejecución de varias instrucciones que paso a detallar.

  • Crear grupo «ansible».
  • Crear usuario «ansible».
  • Genero un perfil en el sudoers para que el usuario ansible pueda escalar a root sin pedir contraseña.
  • Creo el directorio .ssh dentro del home del usuario «ansible» ( /home/ansible ).
  • Copio la llave SSH RSA al archivo /home/ansible/.ssh/authorized_keys para poder autenticar al usuario en ese equipo.
  • Le asigno permisos al usuario «ansible» sobre los archivos que se crearon con sudo.
sudo addgroup ansible
sudo adduser --disabled-password --shell /bin/bash --gecos "Ansible User" --ingroup sudo --ingroup ansible ansible
echo 'ansible ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers.d/ansible
sudo mkdir -p /home/ansible/.ssh/
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3S0TKsUWDvmyEdz0/YRcOdVKW4wWniYRhEcX+JH1BIn47ovk4mLZmgv7TCS8Bn0wN6JFXL/KQR60pKVnTfe5FG9LYiiLln3EdinGFwuEJv9XSp/w8uR5SeHUpdQQT3PjyV+Zr9SxDTXRMQB16ZJLMQAltrIHlpucvw56qX4HVNLPUcSCh4cGhSZDbRzRg7OXvZ1ASImc2jOAKHS3XLybXKM9ZhMZ8WxGyv0/e0dik6aEyyAP1Ks7pQfFvr7YbdiPd8/3yivs6dQgveMLBOSl0szPr04zvot6VzKMs5sw8oPDIWgZ5fjiHsVaSCVJT80XFUeq7CNUnj3dSqlc51n/r ansible@rbpi3-001' | sudo tee -a /home/ansible/.ssh/authorized_keys
sudo chown -R ansible.ansible /home/ansible/.ssh

Para facilitar el procedimiento opté por crear un script que se pueda descargar y ejecutar en cada cliente. El link del mío esta acá. Puede adecuarlo con la información de ustedes y después alojarlo en Google Drive, Github, donde gusten. De mínima tiene que adecuar al menos la llave SSH RSA porque sino no les va a servir de nada.

Para ejecutarlo en el servidor cliente, yo tengo que copiar y pegar la siguiente línea.

curl https://www.sismonda.com.ar/files/2020/06/ansible-client.txt_.gz | gunzip | sudo bash

Verificación de instalación de Ansible:

Para ejecutar una prueba básica y confirmar que ansible puede conectarse y ejecutar comando en el servidor que configuré ‘alphaprime.sismonda.local’, voy a ejecutar la siguiente sentencia.

sudo su - ansible
ansible alphaprime.sismonda.local -m ping

Estoy va utilizar un módulo nativo de ansible para verificar el funcionamiento. En la salida debemos obtener el pong a nuestro ping.

Captura de pantalla de ejecución del modulo ping sobre un servidor configurado en hosts.

Durante la ejecución Ansible nos alerto que la versión de Ubuntu que estoy usando esta usando un alias de python3 para tener compatibilidad con versiones previas pero que va a generar conflicto en futuras implementaciones de ansible.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.