Ansible en mi Lab

Estoy finalmente, preparando mis servidores para manejarlos con Ansible. Voy a ir apuntando aquí los pasos que he seguido como notas para el futuro.

1. ssh-key preliminares

El primer problema al que nos enfrentamos al intentar ejecutar cualquier cosa con ansible es que nos pide que confirmemos la huella de la máquina y esto al ser un proceso interactivo no permite que ansible ejecute nada tenga las claves ssh instaladas o no. Así que durante los primeros usos vamos a desactivar la comprobación de huellas.

[defaults]
host_key_checking = False

También como medida temporal se puede exportar esta variable en la sesión:

$ export ANSIBLE_HOST_KEY_CHECKING=False

Con esto lo que va a hacer es aceptar la clave que le ofrezca el servidor y guardarla automáticamente en el archivo .ssh/known_hosts

Otra cosa que se puede hacer para esto es instalarlas “a mano”:

$ ssh-keyscan 192.168.2.200 >> .ssh/known_hosts

Se puede hacer un for que haga un ping a la red completa host por host y luego que ejecute el ssh-keyscan por cada IP viva.

2. Creando los pares de claves rsa

Siguiente paso es tener un par de claves privado/público que nos permita entrar en los servidores.

$ ssh-keygen -t rsa -b 4096 -f .ssh/ansible

Esto nos creará dos archivos: ansible y ansible.pub

3. Instalando las claves rsa en los hosts

Por facilidad de uso, en muchos sitios, recomiendan instalarle las claves a root, pero eso a mi me parece un error. Estaríamos dando un poder ilimitado a esta máquina. Así que lo que vamos a hacer es instalarle las claves, y usar, un usuario regular con capacidad de hacer sudo.

Así pues, el requerimiento básico es tener en el host de destino

  • Servidor ssh instalado y corriendo
  • Usuario con el que se pueda hacer login
  • Que tenga permiso de sudo

Podríamos instalarlas a mano con:

$ ssh-copy-id -i .ssh/ansible [email protected]

Y si tenemos uno, dos o cinco, no hay problema. Ahora, si queremos hacer esto mismo en setenta o cien, ya la cosa se vuelve tediosa.

Nuevamente podemos hacer un for que vaya recorriendo todas. Es una opción. Pero como esto va de ansible, vamos a hacerlo con ansible. El playbook add-server.yml quedaría tal que así:

---
- hosts: all
  tasks:
  - name: Inserta clave ssh en el usuario
    authorized_key:
      user: xuacu
      state: present
      key: "{{ lookup('file', '/home/ansible/.ssh/ansible.pub') }}"
...

No necesita mucha explicación. User es el usuario válido del servidor que vamos a manejar y key es el archivo de clave que hemos creado previamente. Como es un módulo propio de ansible ya sabe donde tiene que ir el archivo, así que es bastante sencillo.

Ahora ejecutamos:

$ ansible-playbook -vv add-server.yml --limit=192.168.2.200 -i ~/hosts/hosts -k

Con -k o --ask-pass le decimos que nos pida la contraseña del usuario para conectar. Cuando esté hecho y funcionando ya no hará falta porque tendrá la clave instalada.

Finalmente debería dar una salida como:

192.168.2.200              : ok=2    changed=1    unreachable=0    failed=0

Podemos comprobar que ha funcionado con:

$ ansible -m ping 192.168.2.200 -i ~/hosts/hosts

O simplemente entrando por ssh indicando la clave y el usuario.