Skip to main content

Ansible

ansible_logo

https://docs.ansible.com/ansible/latest/index.html

Ansible es una herramienta de automatización creada para gestionar varias máquinas de una sola vez. Es capaz de configurar sistemas, desplegar software y orquestar tareas avanzadas como despliegue continuo y actualización continua.

  • Muy popular entre los administradores de sistemas y DevOps.

  • Documentación muy completa, considerada una de las más detalladas existentes.

  • Curva de aprendizaje muy corta.

  • Fuerte enfoque en seguridad y simplicidad.

  • Utiliza el protocolo SSH y un lenguaje YAML (simple).

  • Fácil de realizar mantenimiento.

  • No necesita agentes instalados en las instancias, lo que es su mayor diferencial comparado con Chef y Puppet.

  • Descentralizado, pero puede conectarse con Kerberos, LDAP y otros sistemas de autenticación centralizada.

  • Bueno para gestionar pocas o muchas instancias. No necesariamente solamente máquinas, sino cualquier cosa que acepte SSH como un switch, router, balanceador de carga, etc.

  • Idempotencia, es decir, garantiza que una tarea ya ejecutada no sea ejecutada nuevamente, lo que es una ventaja sobre los scripts, por ejemplo.

  • Uso de plantillas por sustitución de variables usando Jinja.

Pros y Contras

  • No garantiza que la configuración esté activa en todas las máquinas, por lo que usarlo en un parque de máquinas no es la mejor opción. Claro que existen soluciones para esto como la utilización de Ansible Tower que es de pago para potenciar su uso, pero no es la mejor elección.

  • Bueno para ser combinado con otras herramientas como por ejemplo Terraform.

  • Una cosa muy interesante es que necesitamos trabajar con idempotencia. Esto significa que si ejecutas un script varias veces el resultado será siempre el mismo. Por ejemplo, si pediste crear un usuario ejecutando un script y después ejecutaste nuevamente el script, no creará dos veces.

Carpetas

La carpeta raíz de este proyecto contiene un estudio de Ansible con algunas consideraciones basado en el repositorio contenido en study-ansible.

Instalación

Ansible está desarrollado en Python, por lo que puede ser instalado con pip si quieres, pero particularmente prefiero la instalación del binario directamente.

Como es un sistema de código abierto, incluso puedes compilar el código si quieres.

La documentación es tan buena que ni vale la pena reescribirla. Pero para resumir, puedes instalar usando el gestor de paquetes de tu distribución Linux, o Brew en Mac y Chocolatey en Windows, solo consulta el enlace abajo. https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

La versión utilizada durante el estudio fue la 2.10.17

~/projects/ansible/study-ansible main !1                                                                1.1.7 00:27:24
❯ ansible --version
ansible 2.10.17
config file = None
configured module search path = ['/home/david/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
# ruta de los módulos de python
ansible python module location = /home/david/.asdf/installs/ansible-base/2.10.17/venv/lib/python3.10/site-packages/ansible
# cuál es el binario que va a ejecutar
executable location = /home/david/.asdf/installs/ansible-base/2.10.17/bin/ansible
# versión de python
python version = 3.10.2 (main, Mar 14 2022, 20:47:39) [GCC 11.2.0]

El archivo de configuraciones generales de Ansible suele aparecer en /etc/ansible/ansible.cfg y este viene todo comentado, solamente como un ejemplo.

El orden para la búsqueda de este archivo es:

  • 1 en las variables de entorno en caso de que ANSIBLE_CONFIG esté definido.

  • 2 en el directorio actual buscando por el archivo ansible.cfg

  • 3 en el directorio home ~/.ansible.cfg

  • 4 en /etc/ansible/ansible.cfg

Ejemplo del archivo config

Documentación

Ejemplo del archivo hosts

Observa que en el ejemplo tiene una línea comentada de inventario que apunta a /etc/ansible/hosts que es el archivo que define qué máquinas conoce Ansible.

Vale la pena recordar que Ansible solo necesita ser instalado en la máquina de control, pero las máquinas clientes necesitan tener Python instalado.

Sobre Módulos de la Comunidad

Siempre debe consultarse la página de galaxy y verificar si el módulo necesita algo extra.

Por ejemplo, el módulo de AWS galaxy debe ser instalado con el siguiente comando.

ansible-galaxy collection install community.aws

Además, si consultas en la documentación de AWS Ansible.

pip install boto3

Para remover una colección, esta debe ser eliminada directamente removiendo su carpeta. No existe todavía un parámetro para remoción de colección usando ansible-galaxy.

rm -rf ~/.ansible/collections/ansible_collections/nombrecoleccion

Existe una colección interesante que puede ser bien utilizada para Kubernetes

ansible-galaxy collection install kubernetes.core

Extras

Para ayudar a mejorar el código de los playbooks (secuencia de comandos de Ansible en lenguaje YAML) vamos a utilizar ansible-lint. La instalación es simple pero necesita tener Python3 instalado. Consulta la página del proyecto para mejores informaciones.

pip3 install ansible-lint

Consejo

Siempre que en el archivo hosts vayas a definir el intérprete, no lo apuntes hacia /usr/bin/python, sino solamente a python, de esa manera él toma el intérprete que está en el path.

[all:vars]
ansible_python_interpreter=python