Cómo conectar con clúster Proxmox desde Ansible para automatizar tareas de virtualización. Cómo crear usuarios, grupos, API Tokens y cómo Automatizar tareas en Proxmox con Ansible. Configuramos el entorno Ansible para enviar por email el resultado de la ejecución de la tarea.
- Preparar entorno Proxmox, usuario, grupo, roles, API Token.
- Crear playbook en Ansible/Semaphore y conectar con Proxmox.
- Preparar entorno Ansible/Semaphore para enviar estado de las máquinas virtuales por email cada semana.
Preparar entorno Proxmox, usuario, grupo, roles, API Token
La buena práctica, siempre que vayamos a usar un API, es crear un usuario específico para el API, con los permisos estrictamente necesarios. En Proxmox, iremos a «Datacenter» – «Permissions» – «Groups» y pulsaremos en «Create»:

Indicaremos el nombre para el grupo, por ejemplo «ansible»:

En «Permissions», pulsaremos en «Add» y elegiremos «Group Permission»:

Indicaremos «/» para poder tener acceso/visibilidad, de partida, a todos los objetos del clúster Proxmox. Aunque, si queremos afinar los permisos, aquí podemos indicar, por ejemplo /vms, para que solo tenga visibilidad de las máquinas virtuales. Lo importante es elegir el rol apropiado, en «Role», es lo que realmente definirá qué podrá hacer sobre los objetos. En este caso, puesto que usaremos el API para inventariar máquinas, detener, iniciar, realizar snapshots, etc, elegiremos el rol «PVEVMAdmin»:

Una vez elegido el Path, el Group y el Role, marcaremos «Propagate» y pulsaremos «Add»:

Crearemos el usuario para el API, desde «Permissions» – «Users» – «Add»:

Introduciremos los siguientes datos:
- User name: api_ansible.
- Realm: Linux PAM standard authentication.
- Group: Ansible.
- Enabled: marcado.

Y, una vez creado el usuario y asignado al grupo de permisos, crearemos el API Tokens, desde «Datacenter» – «Permissions» – «API Tokens», pulsaremos en «Add»:

Introduciremos los siguientes datos:
- User: elegiremos el creado anteriormente «api_ansible@pan».
- Token ID: ansible.
- Privilege Separation: importante desmarcar esta opción.
- Expire: dejaremos en blanco salvo que queramos establecer una fecha de expiración al token.

Copiaremos el secreto (secret) en lugar seguro, lo necesitaremos más adelante para conectar Ansible con Proxmox.

Crear playbook en Ansible/Semaphore y conectar con Proxmox
En el servidor de Ansible, en la carpeta donde tengamos los playbooks (o en Git si los tenemos en repositorio), crearemos un nuevo playbook:
|
1 |
sudo nano estado_vms_proxmox.yml |

Y le asignaremos este contenido:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
--- - name: Consultar estado de las Maquinas Virtuales en un Cluster Proxmox hosts: localhost gather_facts: no vars: proxmox_api_ip: "192.168.10.200" api_usuario: "api_ansible@pam" api_secreto: "secreto del api token de proxmox" proxmox_nodos: - "n1" - "n2" - "n3" tasks: - name: 1. Asegurar que la libreria proxmoxer esta en Semaphore pip: name: proxmoxer state: present - name: 2. Asegurar que la coleccion de Proxmox esta instalada command: ansible-galaxy collection install community.general changed_when: false - name: 3. Preguntar a la API por los recursos de tipo VM community.general.proxmox_vm_info: api_host: "{{ proxmox_api_ip }}" api_user: "{{ api_usuario }}" api_token_id: "ansible" api_token_secret: "{{ api_secreto }}" node: "{{ item }}" validate_certs: no loop: "{{ proxmox_nodos }}" register: resultados_cluster - name: 4. Mostrar reporte detallado y legible del Cluster debug: msg: | ======================================================================== REPORTE DE INFRAESTRUCTURA PROXMOX ======================================================================== {% for nodo in resultados_cluster.results %} NODO: {{ nodo.item | upper }} ------------------------------------------------------------------------ {% set vms = nodo.ansible_facts.proxmox_vms | default(nodo.proxmox_vms) | default([]) %} {% for vm in vms %} • [ID: {{ vm.vmid }}] {{ "%-15s" | format(vm.name) }} --> ESTADO: {{ vm.status | upper }} RAM Asignada: {{ "%.2f" | format(vm.maxmem | int / 1024 / 1024 / 1024) }} GB RAM en Uso: {{ "%.2f" | format(vm.mem | int / 1024 / 1024 / 1024) }} GB Disco Máximo: {{ "%.2f" | format(vm.maxdisk | int / 1024 / 1024 / 1024) }} GB ------------------------------------------------------------------ {% else %} (No hay máquinas virtuales activas o detectadas en este nodo) {% endfor %} {% endfor %} ======================================================================== |
Teniendo en cuenta:
- api_secreto: cambiaremos por el secret obtenido al crear el API Token en Proxmox.
- proxmox_api_ip: introduciremos la IP de uno de los nodos del clúster Proxmox, si solo tenemos un nodo, la de ese nodo.
- proxmox_nodos: indicaremos el nombre exacto que aparece en la consola web de Proxmox de cada nodo.

- api_token_id: introduciremos aquí el nombre exacto que hayamos establecido en el campo Token ID, al crear el API Token.

Desde la gestión web de Ansible, desde Semaphore, crearemos una nueva plantilla, pulsando en «Plantillas de Tareas» y en «Nueva plantilla»:

Indicaremos los siguientes datos para la plantilla/tarea:
- Nombre: estado_maquinas_virtuales_cluster_proxmox.
- Ruta al archivo de playbooks: muy importante indicar aquí el nombre exacto del fichero .yml creado con el playbook, es este caso estado_vms_proxmox.yml.
- Inventario: aunque en este caso NO es necesario establecer ningún inventario, porque todos los datos de los nodos y datos de conexión (API Token) los establecemos en el fichero .yml anterior, Semaphore nos obliga a poner aquí un valor, por lo que elegiremos cualquier inventario que tengamos. Si no tenemos inventario, crearemos uno cualquiera.
- Repositorio: elegiremos local si el playbook lo hemos creado en el servidor local Ansible.
Pulsaremos en «Crear»:

Realizaremos una primera ejecución de la tarea, pulsando en el botón play:

Si hemos establecido los datos correctamente (grupo, rol, usuario, api token, ip, nombre de nodos, etc.), Ansible conectará con Proxmox directamente, mediante el API, y obtendrá los datos de las máquinas virtuales de cada nodo:

Preparar entorno Ansible/Semaphore para enviar estado de las máquinas virtuales por email cada semana
Desde Semaphore, crearemos un grupo de variables para establecer los datos de conexión al servidor SMTP para el envío del email. En «Grupos de Variables», pulsaremos en «Nuevo grupo»:

Introduciremos los siguientes datos para el grupo de variables:
- Nombre del Grupo: servidor_email.
- Variables adicionales: smtp_user, smtp_pass, email_from, email_to, smtp_host, smtp_port.

En el servidor Ansible, crearemos un fichero .yml de playbook:
|
1 |
sudo nano vm_proxmox_email.yml |
Con el siguiente contenido:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
--- - name: Reporte de Infraestructura Cluster Proxmox por Email hosts: localhost gather_facts: no vars: # --- CREDENCIALES PROXMOX --- proxmox_api_ip: "192.168.10.200" api_usuario: "api_ansible@pam" api_secreto: "secret de api token de proxmox" proxmox_nodos: ["n1", "n2", "n3"] tasks: - name: 1. Asegurar requisitos pip: name: proxmoxer state: present - name: 2. Preguntar a la API por los recursos de tipo VM community.general.proxmox_vm_info: api_host: "{{ proxmox_api_ip }}" api_user: "{{ api_usuario }}" api_token_id: "ansible" api_token_secret: "{{ api_secreto }}" node: "{{ item }}" validate_certs: no loop: "{{ proxmox_nodos }}" register: resultados_cluster - name: 3. Generar y Enviar el Reporte por Email community.general.mail: host: "{{ smtp_host }}" port: "{{ smtp_port | int }}" username: "{{ smtp_user }}" password: "{{ smtp_pass }}" secure: starttls from: "{{ email_from }}" to: "{{ email_to }}" subject: "Estado del Clúster Proxmox" charset: utf8 body: | {% for nodo in resultados_cluster.results %} ============================ NODO: {{ nodo.item | upper }} ============================ {% set vms = nodo.ansible_facts.proxmox_vms | default(nodo.proxmox_vms) | default([]) %} {% for vm in vms %} • [ID: {{ vm.vmid }}] {{ "%-15s" | format(vm.name) }} --> ESTADO: {{ vm.status | upper }} RAM Asignada: {{ "%.2f" | format(vm.maxmem | int / 1024 / 1024 / 1024) }} GB RAM en Uso: {{ "%.2f" | format(vm.mem | int / 1024 / 1024 / 1024) }} GB Disco Máximo: {{ "%.2f" | format(vm.maxdisk | int / 1024 / 1024 / 1024) }} GB ------------------------------------------------------------------ {% else %} (No hay máquinas virtuales activas o detectadas en este nodo) {% endfor %} {% endfor %} =========================== ------------------ Generado por Ansible ProyectoA https://proyectoa.com |
Volvemos a Semaphore y creamos una nueva plantilla («Plantilla de Tareas» – «Nueva plantilla»), introduciendo los siguientes datos:
- Nombre: vm_proxmox_email.
- Ruta al archivo de playbook: vm_proxmox_email.yml.
- Inventario: aunque en este caso NO necesitamos inventario, porque en el playbook van todos los datos, elegiremos un inventario porque es obligatorio: servidores_proxmox.
- Repositorio: Local.
- Grupos de Variables: elegiremos «servidor_email».

Realizaremos una primera prueba de ejecución de la tarea:

Si hemos introducido los datos del servidor de email en las variables y los datos de conexión con el clúster Proxmox, la tarea obtendrá el estado de las máquinas virtuales y enviará el resultado por email:

Recibiremos un email con los datos de las máquinas virtuales de cada nodo:

Para recibir este informe periódicamente, desde Semaphore, pulsaremos en «Horario» – «Nuevo horario»:

Elegiremos «Cron»:

Introduciremos los datos para la programación:
- Name: enviar_email_maquinas_virtuales_proxmox.
- Template: vm_proxmox_email.
- Timing: Weekly.
- Weekdays: Monday, Thursday.
- Hours: 14.
- Minutes: 00.
