Archivo del blog

Mostrando entradas con la etiqueta proxmox. Mostrar todas las entradas
Mostrando entradas con la etiqueta proxmox. Mostrar todas las entradas

25 agosto 2026

Ansible: Poniendo orden en mi laboratorio Proxmox

Automatiza la gestión de tus máquinas virtuales y contenedores sin esfuerzo.

Tengo ya cómo unas diez máquinas Linux funcionando en Proxmox: Debian, Ubuntu y Alpine, cada una haciendo sus tareas diarias. Además, un Windows 11 y un Windows Server Core 2019 para las pruebas de SSCM y Azure que estoy haciendo.

Al principio no supone demasiado trabajo mantenerlas. Pero cuando empiezas a tener varias máquinas, repetir las mismas tareas una y otra vez empieza a ser bastante aburrido. Y aburrido, en este oficio, significa peligroso (porque acabas haciendo las cosas a lo loco).

Así que decidí probar Ansible. Y este es el manual de cómo lo estoy montando, con sus fallos y sus soluciones.


¿Qué quiero conseguir? 

La idea no es montar una infraestructura empresarial ni complicarnos la vida, eso ya lo hacemos en el trabajo. Quiero poder administrar mi laboratorio desde un único sitio. Nada más. Y nada menos.

 

Tabla de objetivos (con su estado real):

ObjetivoEstado
Comprobar que todas las máquinas están disponibles✅ Hecho
Actualizar Debian y Ubuntu (apt)✅ Hecho
Actualizar Alpine (apk)✅ Hecho
Gestionar servicios (start/stop/restart)🔄 En progreso
Instalar software🔄 En progreso
Crear usuarios🔄 En progreso
Ejecutar comandos remotos✅ Hecho
Automatizar tareas repetitivas🔄 En progreso
Actualizar Windows⏳ Pendiente (requiere WinRM)
Registrar qué ha ocurrido (logs)🔄 En progreso


Mi laboratorio

Para este manual voy a utilizar un escenario bastante parecido al que podemos encontrar en un laboratorio doméstico o de pruebas:

                         PROXMOX
                            │
             ┌──────────────┴──────────────┐
             │                             │
       ANSIBLE CONTROLLER              OTRAS VM/LXC
          Debian Linux                     │
             │                             │
      ┌──────┼────────┬─────────┐          │
      │      │        │         │          │
    Debian  Ubuntu  Alpine    Debian     Windows
      │      │        │         │        ┌───┴────┐
      │      │        │         │        │        │
     VM/LXC VM/LXC  VM/LXC    VM/LXC    Win11  WServerCore2019

No hace falta que todas las máquinas sean iguales para que esto funcione, de hecho, esa es precisamente la gracia. Tenemos diferentes distribuciones, diferentes servicios y también Windows.


¿Por qué necesito Ansible?

Imaginemos que quiero actualizar todos mis Debian y Ubuntu.

Sin Ansible:

SSH → Debian 1 → apt update &&  apt full-upgrade -y
SSH → Debian 2 → apt update &&  apt full-upgrade -y
SSH → Ubuntu 1 → apt update &&  apt full-upgrade -y
SSH → Debian 3 → apt update &&  apt full-upgrade -y
...

Y si tengo diez máquinas, acabamos haciendo lo mismo diez veces.

Con Ansible:

ansible servidores -m apt -a "update_cache=yes"

Y Ansible se encarga del resto.

Una orden. Todas las máquinas. Más tiempo para mí.


Pero tengo Alpine...

Aquí aparece una situación interesante de nuestro laboratorio.

Alpine Linux utiliza apk, mientras que Debian y Ubuntu utilizan apt.

No podemos tratar todas las máquinas exactamente igual.

Podemos organizar el inventario:

[debian]
debian01
debian02
debian03

[ubuntu]
ubuntu01
ubuntu02

[alpine]
alpine01
alpine02

[windows]
windows11
servercore2019

Ahora podemos decidir qué hacer con cada grupo.

Por ejemplo:

Debian/Ubuntu → apt
Alpine        → apk
Windows       → WinRM

Y esto nos permite empezar a ver por qué Ansible resulta tan interesante cuando nuestro laboratorio empieza a crecer.


¿Y Windows?

También vamos a tocar Windows.

En nuestro laboratorio tenemos:

  • Windows 11 Pro
  • Windows Server Core 2019

Ansible puede administrar Windows, aunque la comunicación y algunas tareas son diferentes a Linux.

Esto nos permitirá ver algo bastante útil:

                    Ansible
                       │
          ┌────────────┴────────────┐
          │                         │
        Linux                     Windows
          │                         │
    ┌─────┼─────┐              ┌────┴─────┐
    │     │     │              │          │
  Debian Ubuntu Alpine        Win11   Server Core

Así que el manual no será simplemente:

"Instala Ansible y ejecuta ping".

La idea será llevarlo desde cero hasta utilizarlo realmente en un laboratorio heterogéneo.


El objetivo del manual

Al terminar tendremos algo parecido a esto:

                    ┌─────────────────┐
                    │    PROXMOX      │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │ Debian Ansible  │
                    │    Controller   │
                    └────────┬────────┘
                             │
             ┌───────────────┼────────────────┐
             │               │                │
             ▼               ▼                ▼
          Linux           Linux           Windows
        Debian/Ubuntu     Alpine          Win11
                                          Server 2019

Y desde nuestro Debian podremos hacer cosas como:

Actualizar servidores

ansible linux -m ...

Comprobar máquinas

ansible all -m ping

Instalar paquetes

ansible debian -m ...

Gestionar servicios

ansible linux -m ...

Y, sobre todo, empezar a crear Playbooks, que serán los que realmente nos permitirán automatizar nuestro laboratorio.

Lo primero: instalar Ansible en el nodo controlador

Un solo nodo Debian será el “jefe” que habla con todos los demás.

Requisitos previos:

  • Un Debian 12 recién instalado (o cualquiera que tengas).
  • Acceso por SSH a todas las máquinas objetivo (con clave pública, no contraseña).
  • Python 3 (viene por defecto en Debian 12).

Instalación (en el nodo controlador):

# Actualiza el sistema
sudo apt update && sudo apt upgrade -y # Instala Ansible (desde los repos oficiales de Debian)
sudo apt install -y ansible # Verifica la instalación
ansible --versión # Verifica la versión de Phyton
python3 --version


🔑 Paso 2: Generar clave SSH para Ansible


Objetivo: Ansible se autentica sin contraseña hacia Debian/Ubuntu/Alpine y también más adelante hacia Windows (WinRM aparte).

Ahora en el controller, que en nuestro caso es en la MV Debian que tenemos en Proxmox, tenemos que ejecutar el código:


ssh-keygen -t ed25519 -b 4096 -C "ansible-controller" -f ~/.ssh/id_ed25519


    Te va a pedir passphrase: Pero lo dejamos en blanco para el laboratorio, aunque en producción tendrías que usar un usuario y contraseña segura.

📤 Paso 3: Copiar la clave pública a todas las VMs/LXC

Vamos por lo simple: ssh-copy-id

Asumiendo que el usuario destino en Linux es el mismo en todas (ej. debian/ubuntu/alpine), por ejemplo:

*NdelA: En un entorno de producción, el usuario no debe de ser nunca el "root" o Administrador en Windows por seguridad, en el lab, pues lo dejamos como queramos ;-)


ssh-copy-id -i ~/.ssh/id_ed25519.pub debian@debian01

ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@ubuntu01

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@alpine01

y así en todos los equipos que tengamos...


📌 Ojo: Revisa esto antes de empezar con el SSH.

Resulta que tenemos bloqueado el SSH con el usuario root, para habilitarlo tenemos que hacer esto:

nano /etc/ssh/sshd_config y descomentamos la línea: PasswordAuthentication y le ponemos un YES en vez de lo que tiene: 



Verás que en el Alpine, no viene configurado el Python3, viene bastante pelado por defecto, por lo que tendremos que instalarlo para que funcione:

apk update && apk add python3


Luego hacemos un python3 --version para ver si lo tenemos instalado:


🗂️ Paso 5: Inventario Ansible (para que luego todo encaje)

Ahora vamos a crear un inventario sencillo, por ejemplo:

Vamos a crear una carpeta ~/ansible-lab y dentro hacemos el fichero: inventory.ini con los nodos.



y creamos el fichero inventory.ini



Y lo probamos:

ansible pihole -i inventory.ini -m ping


Nos aparece un hermoso Warning, no te alarmes, es un aviso de Ansible sobre el descubrimiento automático de Python.
Mientras vemos que tenemos un pong, nos alegra ver que funciona.

Si te molesta el warning dichoso como a mí, en el inventory.ini, tienes que añadir una línea
que indique explícitamente qué intérprete Python debe usar Ansible.

[linux:vars]
ansible_python_interpreter=/usr/bin/python3


Y con eso ya no nos sale el warning.

Ejecutamos el ansible linux -i inventory.ini -m setup -a 'filter=ansible_distribution'
y nos dice las máquinas que tenemos online:


Playbooks


Ahora vamos con los playbooks con lo que queremos que hagan:

Primer creamos una carpeta dentro en la misma altura donde teníamos creado el inventory.ini:


Y aquí empieza lo bueno: vamos a crear un único Playbook que:
Detecte el sistema operativo.
Use apt en Debian/Ubuntu.
Use apk en Alpine.
Actualice los paquetes.
Nos muestre claramente qué ha hecho.
No ejecute nada en Windows.


creamos nuestro primer yml, lo vamos a llamar update-linux.yml con el contenido:



y una vez creado vamos a ejecutarlo:

ansible-playbook -i inventory.ini playbooks/update-linux.yml


Y ya tenemos los equipos actualizados.

Y como guinda del pastel, creamos una tarea para que lo lance semanalmente

 

Y con esto tenemos ya un laboratorio Linux completamente gestionado desde Ansible.

Hemos aprendido a:

✅ Instalar Ansible en nuestro controlador Debian
✅ Configurar acceso SSH mediante claves
✅ Crear un inventario organizado por grupos
✅ Ejecutar comandos remotos
✅ Comprobar el estado de las máquinas
✅ Detectar distribuciones automáticamente
✅ Actualizar Debian, Ubuntu y Alpine desde un único Playbook

Todo ello desde una sola consola y sin necesidad de ir conectándonos máquina por máquina.


¿Y Windows?

Windows se ha quedado aparcado por ahora.

No porque Ansible no pueda gestionarlo, sino porque requiere una configuración adicional mediante WinRM, certificados, reglas de firewall y algunos ajustes que merece la pena explicar con calma para no volvernos locos a la primera prueba.

Además, quiero enseñarlo funcionando tanto contra Windows 11 como contra Windows Server Core 2019, que es donde realmente se pone interesante.

Pero si le dais cariño al post, prometo hacer una segunda vuelta.
De momento sigo de vacaciones, así que toca disfrutar un poco antes de volver a pelearme
con WinRM... 😄

10 febrero 2026

Cómo ordené mi red con Pi-hole y Nginx Proxy Manager sobre Proxmox

Esta es mi manera de ordenar la red usando Pi-hole como servidor DNS y Nginx Proxy Manager cómo proxy, todo en Proxmox.


Llega un punto, casi sin avisar, en el que tu red doméstica deja de ser un router con cosas colgando y empieza a pedir orden. No más IPs memorizadas a la fuerza, no más puertos abiertos porque sí, no más notas mentales del tipo “esto iba por el 8083… creo”. En este artículo no va de instalar Pi-hole ni Nginx Proxy Manager. Hay docenas de tutoriales excelentes para eso, y repetirlos sería ruido innecesario. Esto va de cómo encajan, de por qué tiene sentido usarlos juntos y de cómo Proxmox, con contenedores LXC separados, convierte el caos en algo razonablemente civilizado, y sobre todo usable para los demás usuarios de casa, si quieres...


El escenario

Mi base es Proxmox, pero puedes usar la que más te guste. No lo hago por moda, sino porque cuando empiezas a separar servicios en contenedores, la cabeza descansa. Además, todo mi lab ya vive en Proxmox y si empiezo a levantar más cacharros físicos, Endesa me hace cliente VIP.

NdA: Cuando creas los LXC puedes usar los recursos por defecto, pero verás que te quedas corto bastante rápido. Mi recomendación es darles algo más desde el principio.

  • Un LXC para Pi-hole

  • Un LXC para Nginx Proxy Manager

  • Otros LXCs para los servicios que quieras publicar

Cada cosa en su sitio. Cada problema con su frontera clara.

Mi Proxmox

Pi-hole: más que bloquear anuncios

Pi-hole suele presentarse como un bloqueador de publicidad, y una manera de mantenerte en el anonimato, Lo es, y muy bueno. Pero ese no es su superpoder principal, Pi-hole es, ante todo, un servidor DNS

Y cuando decides que sea el DNS de tu red, pasan cosas buenas:

  • Tú decides cómo se resuelven los nombres
  • Los servicios internos dejan de depender de IPs
  • La red se vuelve predecible

En una red pequeña puedes sobrevivir a base de IPs memorizadas. En cuanto crece un poco, eso se vuelve frágil, no estamos hechos para ir recordando secuencias de números. Un dominio interno es la forma de poner nombres estables a servicios que, por debajo, pueden cambiar. No es una cuestión estética: es una capa de orden. Elegirlo bien evita comportamientos raros y ahorra tiempo cuando algo deja de responder. Así que le decimos Adiós al 192.168.1.20 para entrar a Proxmox y le decimos hola al Proxmox.lab, o Proxmox.casa o el que mejor te convenga.

Durante bastante tiempo usé .local. Parecía lógico. Era local. Funcionaba… hasta que empezó a no hacerlo de formas extrañas. Tras investigar y golpearme siempre con la misma pared, vi que el dominio ".local" está reservado para multicast DNS o mDNS. Eso significa que Windows, macOS, impresoras y demás fauna intentan resolverlo por caminos alternativos antes de preguntar al DNS tradicional. 

El resultado es una red que a veces responde y a veces decide filosofar, y por eso ya casi nadie lo recomienda, y con razón.

En mi caso, lo que hice fue cambiar a ".lab" fue una de esas decisiones pequeñas que eliminan problemas grandes, y tras días batallando la verdad es que fue toda una alegría:

  • DNS clásico

  • Resolución consistente

  • Cero comportamientos mágicos

Tras configurar las IPs de los servicios, apuntando todos al NPM, me quedó de la siguiente manera:

Estos son mis servicios publicados en red.

Nginx Proxy Manager: el portero elegante

Si Pi-hole es el cerebro que resuelve quién es quién en la red, Nginx Proxy Manager (NPM) es el portero que decide quién entra y cómo. Su magia no está en la complejidad de comandos, sino en centralizar el control y simplificar la gestión.

Rol de NPM

  • Un único punto de entrada para todos los servicios.

  • Redirección inteligente según el nombre de dominio.

  • Gestión visual de certificados SSL, automática y sin dolor.

Ventajas de separar el proxy del servicio

Tener NPM en su propio LXC te da:

  • Flexibilidad: agregas o quitas servicios sin tocar el proxy.

  • Seguridad: los contenedores no se exponen directamente a internet.

  • Orden mental: un solo panel para todo el tráfico.

Estrategia de nombres y subdominios

  • Pi-hole resuelve servicio.lab

  • NPM decide a qué contenedor apunta; nuestro caso apunta al NPM.

  • Resultado: URLs simples, predecibles y legibles




La estructura nos quedaría así:

Cliente

   │

   ▼

Pi-hole (DNS) 192.168.1.53

   │

   ▼

Nginx Proxy Manager 192.168.1.34

   │

   ├──► LXC Proxmox     192.168.1.90:8006

   ├──► LXC Nextcloud   192.168.1.91:443

   ├──► LXC Plex        192.168.1.92:32400

   └──► LXC MeTube      192.168.1.93:8081

Lo que NPM te ahorra

  • No memorizar puertos extraños

  • No tocar nginx manualmente por cada servicio

  • Posibilidad de crecimiento sin caos

“NPM es el portero que no se cansa, que nunca olvida nombres, que te deja dormir tranquilo mientras tus servicios hablan entre ellos con respeto.”

Cómo encajan las piezas

Aquí está la idea central, y no hace falta una sola línea de comando para entenderla:

  1. El navegador pide servicio.lab

  2. Pi-hole resuelve ese nombre y apunta al LXC de NPM

  3. NPM recibe la petición y la envía al contenedor correcto

DNS decide a quién llamas.

El proxy decide quién responde.


Lo que no haces

A veces el verdadero progreso está en las cosas que dejas de hacer:

  • No abres puertos innecesarios

  • No recuerdas IPs

  • No gestionas certificados en cada servicio

  • No mezclas responsabilidades

Cada pieza tiene una función clara. Cuando algo falla, sabes dónde mirar.


El resultado

El resultado no es solo técnico, es mental:

  • URLs limpias

  • Servicios coherentes

  • Red entendible incluso meses después

No es la única forma de hacerlo. No es la más rápida. Pero es una de esas configuraciones que, una vez montadas, dejan de molestar. Y eso, en una red doméstica, es oro.


Cierre

Autoalojar servicios no va de acumular contenedores. Va de entender qué papel juega cada cosa y de construir algo que no se derrumbe cuando pasa el tiempo.

Pi-hole como DNS y Nginx Proxy Manager como proxy inverso no son trucos avanzados. Son piezas sencillas bien colocadas.

Y cuando las piezas encajan, la red deja de ser un experimento constante y se convierte en una herramienta fiable.

Que, al final, es justo lo que uno busca, y poder disfrutar del trabajo sin estar siempre con un ojo encima para ver si todo funciona correctamente.

03 noviembre 2025

🥑 Instalar y configurar Apache Guacamole en Proxmox paso a paso

 Que es Apache Guacamole?

Acceder de forma remota a nuestros servidores, escritorios o equipos de trabajo se ha vuelto esencial, ya sea en entornos domésticos, profesionales o educativos. La mayoría de las veces dependemos de clientes pesados como Remote Desktop, VNC Viewer o PuTTY, que requieren instalación, configuración y mantenimiento en cada dispositivo desde el que nos conectamos.

Aquí es donde entra en juego Apache Guacamole, un proyecto open-source desarrollado por la Fundación Apache, que permite acceder a escritorios y servidores directamente desde el navegador, sin necesidad de instalar nada más que un navegador moderno.

Con Guacamole puedes:

  • Conectarte por RDP, VNC o SSH desde cualquier dispositivo.

  • Centralizar todas tus conexiones en una sola interfaz web.

  • Olvidarte de instalaciones pesadas: solo entras con tu usuario y contraseña.

  • Usarlo como una pasarela de acceso remoto centralizada y segura.

En este tutorial veremos cómo desplegar Apache Guacamole en un servidor Proxmox VE, aprovechando la flexibilidad de los contenedores (LXC) o máquinas virtuales, y con soporte para Docker y Docker Compose. Al final tendrás un servicio completamente funcional, accesible vía navegador y listo para añadir tus conexiones remotas.

🧱 Instalación paso a paso en Proxmox (LXC)

Vamos a aprovechar un script automático mantenido por la comunidad para instalar Guacamole sin complicaciones.
👉 Enlace oficial del script:
https://community-scripts.github.io/ProxmoxVE/scripts?id=apache-guacamole

1️⃣ Crear el contenedor LXC

Desde la consola de tu Proxmox, ejecuta:

bash -c "$(wget -qLO - https://community-scripts.github.io/ProxmoxVE/scripts/setup.sh)"

Esto abrirá el menú interactivo del Proxmox Helper-Scripts.

El script se encargará de crear un contenedor LXC basado en Debian 12, instalar Docker y desplegar Apache Guacamole con todo configurado.

Durante el proceso te pedirá algunos datos, o si hemos escogido la opción por "default" nos lo rellenará todo automáticamente.

🚀 Configuración inicial y primer acceso

Abre el navegador y entra a la dirección del contenedor o servidor.
Por ejemplo:

http://TU_IP:8080/guacamole


Verás la pantalla de inicio de sesión.

Credenciales por defecto:

Usuario: guacadmin Contraseña: guacadmin


➡️ Una vez dentro, lo primero que deberías hacer es cambiar la contraseña de guacadmin:

  1. Clic en tu nombre (arriba a la derecha).

  2. “Preferences” → “Change Password”

🔌 Añadir conexiones (RDP, SSH, VNC)

Desde el panel principal:

  1. Ve a Settings → Connections → New Connection.

  2. Rellena los campos según el tipo de conexión:


🖥️ RDP (Windows)
  • Protocol: RDP

  • Hostname: IP o nombre del equipo Windows

  • Port: 3389

  • Username / Password: credenciales del usuario

  • (Opcional) Marca Enable clipboard o Full screen

💻 SSH (Linux)

  • Protocol: SSH

  • Hostname: IP del equipo

  • Port: 22

  • Username / Password o clave privada.

🧩 VNC (Escritorio remoto genérico)

  • Protocol: VNC

  • Hostname: IP del equipo

  • Port: 5900

💡 Cada conexión que crees aparecerá como un icono en la pantalla de inicio.


🛡️ Buenas prácticas y seguridad

Antes de dejarlo en producción o abrirlo a Internet, revisa esto:

  • 🔐 Cambia la contraseña de guacadmin (¡en serio!).

  • ⚙️ Usa HTTPS (por ejemplo, con un proxy inverso Nginx o Caddy).

  • 🧱 Si lo expones fuera, usa fail2ban o firewall.

  • 📦 Haz copia de seguridad del volumen /config o del contenedor entero.

  • 🚪 Cambia el puerto 8080 si lo deseas (en Docker o LXC).


🧭 Conclusión

Con esto ya tienes tu propio portal de acceso remoto vía web funcionando, sin dependencias de clientes ni software adicional.

Puedes conectar a servidores, PCs, Raspberry Pi o incluso otros contenedores, todo desde una única página web.

💬 Y listo, Guacamole funcionando y accesible desde cualquier navegador.

Nos leemos en el próximo post 👋

15 octubre 2025

🛠 Manual para instalar Vaultwarden en Proxmox usando un script.

Vaultwarden es una alternativa ligera y autoalojada a Bitwarden. Es ideal si quieres tener el control total de tus contraseñas y alojarlo tú mismo en casa o en tu entorno Proxmox. A continuación, te explico paso a paso cómo hacerlo utilizando el script de tteck, que automatiza la instalación en un contenedor LXC.


Copiaremos este enlace en la consola de nuestro ProxMox.

Configura los parámetros del contenedor

El script te pedirá que configures algunas opciones básicas:

  • ID del contenedor: Puedes dejar el valor por defecto o elegir otro si prefieres.

  • Hostname: Por ejemplo, vaultwarden.

  • Dirección IP: Si usas IP estática o DHCP.

  • Tamaño del disco, RAM y CPU: Adapta estos valores según tus recursos disponibles.

  • Contraseña del root para el contenedor.

  • Otras opciones como acceso SSH, backups automáticos, etc.

Puedes usar las opciones por defecto si no estás seguro

Nosotros cogeremos la opción por defecto:

 Accede a Vaultwarden

Desde un navegador en tu red local, entra a:

http://IP_DEL_CONTENEDOR:8000

Ahí podrás crear tu cuenta de usuario.


Y listo, Vaultwarden corriendo dentro de Proxmox, fácil, rápido y sin depender de nadie. Un paso más para tener tu propio ecosistema digital en casa, 100% tuyo.

Nos leemos en el próximo post 👋

Ansible: Poniendo orden en mi laboratorio Proxmox

Automatiza la gestión de tus máquinas virtuales y contenedores sin esfuerzo. Tengo ya cómo unas diez máquinas Linux funcionando en Proxmox...