Contenido

Laboratorio 3

Enunciado

Tu equipo de desarrollo necesita tres servidores web idénticos en un entorno de laboratorio. En tu servidor Proxmox has creado tres contenedores LXC con Ubuntu Server 24.04. Ahora debes usar Ansible para configurarlos de forma automática y consistente. El playbook de Ansible debe realizar las siguientes tareas en todos los servidores:

  1. Actualizar la caché de paquetes e instalar Nginx.
  2. Habilitar y arrancar el servicio Nginx.
  3. Configurar el firewall UFW para permitir solo tráfico HTTP (puerto 80) y SSH (puerto 22).
  4. Desplegar una página HTML personalizada (por ejemplo, un “Hola Mundo” que indique el nombre del servidor).

El inventario de Ansible debe estar correctamente definido.

Herramientas

  • Contenedores LXC Proxmox
  • Ansible
  • Nginx

Requisitos previos

Crear 3 contenedores LXC en Proxmox y listar sus direcciones ip, deben ser accesibles por SSH.

Ejecución

Contenedores en Proxmox

  • Creamos el primer contenedor, colocamos su nombre y clave:

    /img/posts/proyectos/laboratorio3/1.png

  • Seleccionamos la imagen Ubuntu 24.04:

    /img/posts/proyectos/laboratorio3/2.png

  • Dejamos el disco predeterminado:

    /img/posts/proyectos/laboratorio3/3.png

  • Seleccionamos 2 nucleos de CPU:

    /img/posts/proyectos/laboratorio3/4.png

  • Colocamos 1024 MiB de memoria:

    /img/posts/proyectos/laboratorio3/5.png

  • Seleccionamos DHCP en IPv4 para obtener la direccion de red automaticamente:

    /img/posts/proyectos/laboratorio3/6.png

  • Dejamos DNS predeterminado:

    /img/posts/proyectos/laboratorio3/7.png

  • Verificamos y aceptamos:

    /img/posts/proyectos/laboratorio3/8.png

    /img/posts/proyectos/laboratorio3/9.png

  • Realizar estos pasos 2 veces mas para los contenedores faltantes cambiandole el nombre en la pantalla inicial.

    /img/posts/proyectos/laboratorio3/10.png

  • Tomamos nota de las ip asignadas a los hosts:

    /img/posts/proyectos/laboratorio3/ips.png

Configurar SSH

Comprobar que en cada host en el archivo /etc/ssh/sshd_config tengan habilitadas estas opciones:

PermitRootLogin yes
PasswordAuthentication yes

si no estan habilitadas ejecutar lo siguiente:

# Habilitar autenticación por contraseña para root
sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config

# Reiniciar servicio SSH
sudo systemctl restart sshd

Luego de revisar la configuracion de los host se procede a copiar la clave publica del host Ansible en los destinos para poder conectarnos por ssh, podemos ejecutar los siguientes comandos:

#Instalamos sshpass 
sudo apt install sshpass

#Creamos un archivo txt con la clave de los hosts
echo -n "contraseña" > pass.txt
chmod 600 pass.txt


#Ejecutamos el siguiente script, en este punto debemos tener las claves publica y privada generadas con ssh-keygen

#!/bin/bash
# Ejecutar después de haber habilitado el login con contraseña para root en los nodos

PASSFILE="pass.txt"
IPS=("192.168.1.182" "192.168.1.128" "192.168.1.152")

for ip in "${IPS[@]}"; do
    echo "Instalando clave en $ip..."
    sshpass -f "$PASSFILE" ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_ed25519.pub root@"$ip"
done
echo "Listo."

Configurar Ansible

Ya teniendo acceso por ssh podemos crear la configuracion de ansible.

Crear Inventorio

En la raiz del pryecto creamos un archivo inventory.ini, este archivo contiene los host al cual conectarse, tambien las variables para esta conexion como el usuario.

/img/posts/proyectos/laboratorio3/inventory.png

Comprobamos que Ansible se pueda comunicar a los host con:

ansible myhosts -m ping -i inventory.ini

/img/posts/proyectos/laboratorio3/pong.png

Ejecutar Ansible

Creamos un playbook de ansible donde apliquemos las configuraciones necesarias para completar la tarea y configurar los host:

# play.yml
---
- name: Update web servers
  hosts: myhosts
  remote_user: root

# Actualizar Cache de paquetes
  tasks:
    - name: Actualizar caché de APT
      ansible.builtin.apt:
        update_cache: true
# Instalar Nginx
    - name: Instalar Nginx
      ansible.builtin.apt:
        name: nginx
        state: present

# Iniciamos UFW
    - name: Habilitar UFW
      community.general.ufw:
        state: enabled
        policy: deny

# Configurar UFW para permitir solo trafico por puerto TCP 80 y 22
    - name: Configuracion de ufw
      community.general.ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop:
        - '80'
        - '22'

# Desplegar pagina web personalizada
    - name: Desplegar pagina web en Nginx
      ansible.builtin.template:
        src: index.html.j2
        dest: /var/www/html/index.html
        owner: root
        group: root
        mode: '0644'
...

En este playbook usamos los modulos integrados en ansible para configurar e instalar paquetes, primero indicamos la lista de tareas indicando que se ejecuten sobre los host myhosts del archivo inventory.ini, luego actualizamos el sistema e instalamos Nginx con el modulo ansible.builtin.apt, configuramos el firewall con community.general.ufw y por ultimo creamos una pagina web usando las plantillas Jinja y el modulo ansible.builtin.template.

Ejecutamos el playbook con:

ansible-playbook -i inventory.ini play.yml 

Luego de un par de pruebas verificamos la ejecucion sin errores:

/img/posts/proyectos/laboratorio3/ejecucion.png

En este momento los tres hosts tiene una configuracion identica, al acceder a cada uno tenemos:

/img/posts/proyectos/laboratorio3/host1.png /img/posts/proyectos/laboratorio3/host2.png /img/posts/proyectos/laboratorio3/host3.png

Repositorio

Laboratorio 3

Este es el fin del laboratorio numero 3, si quieres dejame un comentario o tu opinion por Linkedin.

Saludos!