Integración de Ansible y Azure (parte 1)

Este post pertenece a una serie de publicaciones relacionadas.

En los días que corren, el concepto de IaC (Insfrastructure as Code) se ha vuelto moneda corriente entre los sysadmins. Por ello, creo que es necesario hablar sobre las posibilidades que Azure nos brinda realizar las tareas de la mejor manera posible.

Si bien existen varias alternativas para abordar el tema de considerar la “infraestructura como código”, creo que una de las herramientas que está creciendo día a día es Ansible.

Introducción a Ansible

Ansible es un software que cae dentro de la categoría Configuration Management Tools. Su uso principal radica en la posibilidad de escribir en un lenguaje declarativo la configuración que debe poseer un determinado servidor (o un grupo) en los llamados playbooks, para posteriormente asegurarse que esos servidores se encuentren configurados tal como se definió.

Los playbooks estpan estructurados usando YAML (Yet Another Markup Language) y soportan el uso de variables (más adelante se demostrará con ejemplos).

A diferencia de otras Configuration Management Tools como Puppet o Chef, Ansible es agent-less, lo que significa que no requiere la instalación de ningún software en los servidores administrados. Ansible utiliza SSH para administrar máquinas Linux y PowerShell (de forma remota junto a WinRM) para administrar sistemas Windows.

Ansible incluye una suite de módulos para interactuar con ARM (Azure Resource Manager), ofreciendo mejores herramientas para crear y orquestar de forma sencilla la infraestructura en Azure. Estos módulos son bibliotecas de Python, debido a que Ansible está completamente escrito en Python y utiliza el Azure Python SDK.

¿Cómo empezamos a trabajar?

No todos los que usan Azure a diario (sin importar las tareas que realicen) conocen lo siguiente:

Azure Cloud Shell

Azure Cloud Shell

Y menos aún, saben que dentro de la shell que proporciona Azure, se encuentra instalado Ansible por defecto. Para comprobar ésto, basta con ejecutar lo siguiente (y de paso vamos a saber la versión que se encuentra instalada):

ansible --version

Ansible version

Si desean saber que otras herramientas se encuentran disponibles en la Azure Cloud Shell, existe el siguiente enlace:

Features & tools for Bash in Azure Cloud Shell

Azure credentials

Ansible se comunica con Azure usando un nombre de usuario y contraseña o un service principal. Un Azure service principal es una identidad de seguridad que puede ser utilizada en aplicaciones, servicios y herramientas de automatización (como Ansible, por ejemplo). El usuario define y controla los permisos sobre qué operaciones puede realizar el service principal en Azure.

Para crear un service principal dentro de la Azure Cloud Shell se debe ejecutar:

az ad sp create-for-rbac --query '{"client_id": appId, "secret": password, "tenant": tenant}'

Más información: az ad sp create-for-rbac

El resultado debería ser similar al siguiente:

{
  "client_id": "eec5624a-90f8-4386-8a87-02730b5410d5",
  "secret": "531dcffa-3aff-4488-99bb-4816c395ea3f",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db47"
}

Para autenticar contra Azure es necesario contar con el subscription ID, ejecutando el comando az account show:

az account show --query "{ subscription_id: id }"

Crear el archivo de credenciales para Ansible

Para proveer de credenciales a Ansible es posible generar variables de entorno o crear un archivo local.

Dentro de la consola vamos a ejecutar los siguientes comandos para crear el archivo de credenciales para Ansible:

mkdir ~/.azure
vi ~/.azure/credentials

Para los que no tienen mucho dominio del editor de textos vi, en esta oportunidad lo único que debemos saber es que para poder ingresar valores en el nuevo archivo credentials, es necesario pulsar la tecla Insert. Para guardar los cambios y salir del editor, debemos pulsar la tecla Esc, escribir :wq y pulsar la tecla Enter.

Ansible credentials file

Los valores a ingresar dentro del archivo tienen que tener la siguiente forma:

[default]
subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_id=eec5624a-90f8-4386-8a87-02730b5410d5
secret=531dcffa-3aff-4488-99bb-4816c395ea3f
tenant=72f988bf-86f1-41af-91ab-2d7cd011db47

Que corresponden a la salida de los comandos anteriormente ejecutados (az ad sp create-for-rbac y az account show).

Continuará…

Happy scripting!

Comments