Escribe y Ejecuta Playbooks de Ansible en un entorno de pruebas con Vagrant
En este post explicamos como crear un entorno de pruebas para Ansible utilizando Vagrant, una herramienta que nos permite configurar entornos de desarrollo de manera rápida y reproducible. La intención principal es proporcionar un recurso práctico y accesible para experimentar con Ansible de forma segura y confiable.
Compartimos todo el código usado en el tutorial en este repositorio: https://github.com/thesentinella/ansible-test-environment-with-vagrant
¿Por qué usar Vagrant?
Vagrant ofrece entornos de trabajo (Máquinas virtuales) que son fáciles de configurar, reproducir y portátiles. Esto significa que puedes crear entornos virtuales con facilidad, asegurando que tu configuración se mantenga consistente entre diferentes máquinas. Cuando desarrollamos playbooks o queremos validar comandos ad-hoc de ansible, es ideal hacerlo primero en un entorno de pruebas antes que realizarlo en infraestructura de producción.
Vagrant se destaca como una herramienta esencial para los equipos de desarrollo y operaciones debido a sus beneficios clave:
- Facilidad de Configuración: Vagrant simplifica enormemente la creación y configuración de entornos de desarrollo. Con solo unos pocos comandos, puedes tener una máquina virtual lista para usar, eliminando la necesidad de configuraciones manuales tediosas.
- Reproducibilidad: Al definir la configuración de la máquina virtual en un archivo (Vagrantfile), garantizamos que todos los miembros del equipo tengan exactamente el mismo entorno, lo que elimina problemas de incompatibilidad y facilita la colaboración.
- Portabilidad: Los entornos Vagrant son portátiles y pueden ejecutarse en cualquier máquina que ejecute Vagrant, lo que significa que puedes compartir fácilmente tu entorno de desarrollo con otros miembros del equipo o incluso con equipos externos.
Pasos para Utilizar el Repositorio
Requisitos Previos
Antes de comenzar, asegúrate de tener instalados Ansible, Vagrant y VirtualBox. Si aún no tienes instalados estos programas, puedes seguir los enlaces proporcionados para obtener instrucciones detalladas sobre cómo hacerlo en tu sistema operativo.
Además, necesitarás una clave SSH en tu máquina local. Si no tienes una, puedes generarla siguiendo estos pasos:
Abre una terminal en tu máquina local.
ssh-keygen -t rsa -b 4096
Presiona Enter para aceptar la ubicación predeterminada del archivo de clave (normalmente ~/.ssh/id_rsa
) y, si lo deseas, proporciona una frase de contraseña para proteger la clave. Una vez generada la clave, puedes encontrarla en ~/.ssh/id_rsa.pub
.
Clona el Repositorio
Clona este repositorio en tu máquina local para comenzar a trabajar:
git clone https://github.com/thesentinella/ansible-test-environment-with-vagrant.git
Inicia el Entorno
Una vez clonado el repositorio, navega a su directorio y ejecuta el siguiente comando para iniciar la máquina virtual:
vagrant up
Ejecuta Ansible
Ahora que la máquina virtual está en funcionamiento, estás listo para ejecutar tus playbooks de Ansible. Utiliza el siguiente comando para realizar un ping a los hosts definidos en el inventario:
ansible -i inventory -m ping myhosts
Si todo está funcionando correctamente, debes ver esta salida:
192.168.56.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Esta salida indica que Ansible pudo conectarse al host especificado, realizar una verificación exitosa y recibir una respuesta del host, confirmando que está accesible y listo para ejecutar comandos adicionales si es necesario.
Ejecuta Playbooks
Explora los playbooks disponibles en el directorio y ejecútalos según tus necesidades. Recuerda que debes especificar el host objetivo utilizando la variable target
.
Por ejemplo el siguiente playbook añade un cronjob a la VM:
ansible-playbook -i inventory playbooks/addcronjob.yaml --extra-vars "target=myhosts"
La salida debe verse así:
PLAY [myhosts] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************************
ok: [192.168.56.10]
TASK [cron] ***********************************************************************************************************************************************************************************
ok: [192.168.56.10]
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.56.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
¡Listo! Ya estás ejecutando playbooks de ansible
Acceso a la Máquina Virtual
Si necesitas acceder a la máquina virtual para fines de depuración o configuración adicional, puedes hacerlo utilizando el siguiente comando
vagrant ssh
También puedes usar un cliente SSH predeterminado con la dirección IP proporcionada en el inventario.
Con estos pasos simples, estarás listo para explorar y experimentar con Ansible en un entorno controlado y seguro. Si tienes alguna pregunta o sugerencia, no dudes en dejar un comentario o abrir un issue en el repositorio. ¡Feliz automatización!
Archivos del Repositorio
Vagrantfile: Este archivo es la piedra angular de tu entorno Vagrant. En él, especificamos la configuración de la máquina virtual, como la imagen base, la red, y las provisiones.
Playbooks de Ansible: Encontrarás una colección de playbooks listos para ser utilizados. Estos playbooks están diseñados para realizar tareas comunes de configuración en el entorno virtual.
Inventario: El archivo de inventario define los hosts sobre los cuales se ejecutarán los playbooks de Ansible. En nuestro caso, solo tenemos un host definido: myhosts
, que apunta a la dirección IP de la máquina virtual creada por Vagrant.
El Vagrantfile
El Vagrantfile es un archivo de configuración escrito en Ruby que describe las características de nuestra máquina virtual, como el sistema operativo base, la asignación de recursos y la red. En nuestro caso, el Vagrantfile incluido en el repositorio tiene la siguiente configuración:
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-24.04"
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.provision "shell" do |s|
ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
s.inline = <<-SHELL
echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
SHELL
end
end
- config.vm.provision: Permite provisionar la máquina virtual con software adicional. En este caso, estamos utilizando una provisión de shell para agregar nuestra clave SSH al archivo
authorized_keys
tanto del usuariovagrant
como del usuarioroot
, lo que nos permite acceder a la máquina virtual sin contraseña. - config.vm.box: Especifica la imagen base de la máquina virtual. En este caso, estamos utilizando una imagen de Ubuntu 24.04 proporcionada por Bento.
config.vm.net
work: Define la configuración de red de la máquina virtual. Aquí, configuramos una red privada y asignamos una dirección IP estática (192.168.56.10) a la máquina virtual.
El inventario de ansible
Este es el inventario que se incluye en el repositorio:
[myhosts]
192.168.56.10 ansible_user=vagrant ansible_ssh_extra_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
[all:vars]
ansible_python_interpreter=/usr/bin/python3
El inventario en Ansible es un archivo que contiene información sobre los hosts en los que se ejecutarán los playbooks o comandos de Ansible. Proporciona una lista de hosts y grupos de hosts a los que Ansible puede conectarse y ejecutar tareas.
[myhosts]
192.168.56.10 ansible_user=vagrant ansible_ssh_extra_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Aquí está lo que significa cada parte del inventario:
- [myhosts]: Esto define un grupo de hosts llamado
myhosts
. En este grupo, especificamos los hosts individuales o las direcciones IP de los servidores a los que Ansible se conectará y ejecutará tareas. - 192.168.56.10: Esta es la dirección IP del host que hemos definido en el grupo
myhosts
. Es el host en el que se ejecutarán los playbooks o comandos de Ansible. - ansible_user=vagrant: Esta es una variable que especifica el usuario que Ansible utilizará para conectarse al host. En este caso, estamos utilizando el usuario
vagrant
. - ansible_ssh_extra_args: Esta variable especifica argumentos adicionales que se pasan al comando SSH al conectarse al host. En este caso, estamos desactivando la verificación estricta del host y evitando que se almacene el host en el archivo
known_hosts
. Esto es útil cuando se trabaja con máquinas virtuales provisionadas dinámicamente, como en el caso de Vagrant. - [all]: Esta sección define variables que se aplican a todos los hosts en el inventario. En este caso, estamos especificando la ruta del intérprete de Python que Ansible utilizará en todos los hosts. Esto es útil cuando la ruta del intérprete de Python varía en diferentes sistemas.