My Profile Photo

Mauricio Villagran - Blog


#Cloud #DevOps #Azure #Powershell #Microsoft


Ansible Dynamic Inventory

Si bien Ansible nos ofrece varias formas de administrar los inventarios en donde generalmente uno carga las ip de las maquinas virtuales para un post despliegue de la configuracion, senti la necesidad de buscar algo que me facilite el despliegue de diferentes configuraciones sin depender de tener que cambiar dichos inventarios. Ansible ofrece inventarios dinamicos, que tan solo es un script desarrollado en Python, y que nos ofrece diferentes maneras de usarlo para desplegar nuestras configuraciones como codigo. Asimismo estos scripts fieron desarrollados depenediendo del provider (Azure, AWS, VMWARE, etc).

AnsibleLogo_Logo

Introducción

Como les comentaba, la idea es ver como funciona este inventario dinamico que, apartir de la version de Ansible 2.8 ya viene integrado, por lo cual no tendremos la necesidad de descargarlo. Pretendo que este articulo sea lo mas practico posible, para que se vea como funciona.

Manos a la obra

Importante!!!: Es muy importante que el nombre del resource group, este todo escrito en minusculas, ya que el script de inventario dinamico, no soporta nombres con letras mayusculas.

1- Vamos a comenzar creando un grupo de recursos en Azure, para ello usaremos AzureCli, que se encuentra disponible directamente desde el portal:

az group create --resource-group testing-rg --location eastus

2- Luego vamos a crear dos maquinas virtuales, con sistema operativo Windows:

az vm create \
  --resource-group testing-rg \
  --name demo-test-vm1 \
  --image "Win2016Datacenter" \
  --admin-username "Demouser" \
  --admin-password "Demouser@123" \
  --location eastus2
az vm create \
  --resource-group testing-rg \
  --name demo-test-vm2 \
  --image "Win2016Datacenter" \
  --admin-username "Demouser" \
  --admin-password "Demouser@123" \
  --location eastus2

3- En este caso vamos a generar un tag para las maquinas virtuales, pero dicho script ofrece otras opciones, por ejemplo podremos desplegar configuraciones cuando la maquina fue recien desplegada e iniciada.

Vamos a crear un tag llamado metricbeat:

az resource tag --tags metricbeat --id /subscriptions/<YourAzureSubscriptionID>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/demo-test-vm1

4- Si usamos la ultima version de Ansible, debemos crear un archivo de configuracion. Es muy importante que el archivo termine en azure_rm.yml:

Para nuestro caso lo vamos a llamar inventarioazure_rm.yml

plugin: azure_rm
include_vm_resource_groups:
- testing-rg
auth_source: auto

5- Una vez que tenemos el archivo de configuracion listo, podremos ejecutar una prueba y ver si nuestros servidores responden, ejecutando el siguiente comando:

ansible all -m ping -i ./inventarioazure_rm.yml

Cuando ejecutemos el comando, podriamos llegar a tener un error como el siguiente, pero que facilmente se soluciona:

Failed to connect to the host via ssh: Host key verification failed.

Para solucionar el error llamado “Host key verification”, se debe esitar el archivo de configuracion de Ansible /etc/ansible/ansible.cfg y luego setear el siguiente valor:

host_key_checking = False

6- Si volvemos a ejecutar el comando del punto 5, veremos el siguiente output:

demo-test-vm1_0324 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
demo-test-vm2_8971 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

7- Ahora que sabemos que todo funciona, vamos a exportar las variables para que queden disponibles en el equipo donde esta corriendo Ansible, para ello ejecutamos el comando export:

export AZURE_TAGS=metricbeat

8- Nuevamente si ejecutamos el comando para verificar que nuestro inventario reconoce las vm, ejecutamos el siguiente comando:

ansible all -m ping -i ./inventarioazure_rm.yml

Aqui hay un detalle no menor, que si se fijan en el resultado del output, solo responde la vm a la cual le creamos el tag:

demo-test-vm1 | SUCCESS => {
    "changed": false,
    "failed": false,
    "ping": "pong"
}

Una vez que tenemos todo esto funcionando, resta generar un playbook para desplegar la configuracion.

Configurando Metricbeat

La idea sera generar un playbook el cual instale el paquete de Metricbeat en todas las VM con el tag “metricbeat”.

1- Vamos a generar un archivo.

metricbeat.yml

2- Copiaremos el siguiente codigo que armamos para la instalacion de metricbeat:

- name: Instalacion de Metricbeat en Azure virtual machine
  hosts: all
  vars:
    - version: 7.3.0
  tasks:
  - name: Verificar Metricbeat no instalado
    win_service:
      name: metricbeat
    register: mb_service

  - name: Descargar Metricbeat
    win_get_url:
      url: https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat--windows-x86_64.zip
      dest: C:\metricbeat.zip
    when: mb_service.exists == false

  - name: Descomprimir zip de Metricbeat
    win_unzip:
      src: C:\metricbeat.zip
      dest: C:\Program Files\
      delete_archive: yes
    when: mb_service.exists == false

  - name: Renombrar directorio de Metricbeat
    win_command: cmd.exe /c rename metricbeat--windows-x86_64 Metricbeat
      args:
      chdir: C:\Program Files\
    when: mb_service.exists == false

  - name: Instalar Metricbeat
    win_shell: .\install-service-metricbeat.ps1
      args:
      chdir: C:\Program Files\Metricbeat\
    when: mb_service.exists == false

3- Una vez que tenemos el playbook armado, podremos ejeucutar el siguiente comando para desplegar dicha configuracion:

ansible-playbook  -i ./inventarioazure_rm.yml  metricbeat.yml

Fin

Con esto estaremos desplegando configuraciones mediante Ansible dinamicamente sin tener la necesidad de editar el archivo de inventario. Es muy util para integrarlo enseguida de un despliegue automatico de maquina virtual.

Azure Ansible Official Page