Multiples Pantallas

Instalar paquetes en Proxmox 8 masivamente

INSTALAR PAQUETES EN PROXMOX 8 EN MASA

Esto es un regalo de navidad para todos aquellos entusiastas de Proxmox o que recientemente lo están conociendo debido a que es el la mejor alternativa tras la compra de VMware por Broadcom. Somos partner de Proxmox desde hace muchos años y te animamos a que des el paso si aun no lo has hecho.

Con este script podrás instalar los paquetes que necesites en tu cluster  o en nodos independientes siempre que tengan la misma contraseña sin tener que ir nodo por nodo.

El funcionamiento es simple, en nuestra máquina o máquina donde ejecutemos el script necesitamos 3 cosas:

Instalar sshpass

apt-get install sshpass

Un fichero de texto con nombre e ips de los nodos una por linea

PVE1 192.168.1.250

PVE2 192.168.1.251

PVE3 192.168.1.252

Un fichero de texto con los paquetes a instalar, uno por línea

telnet

net-tools

Teniendo esto creamos nuestro script install-packets.sh pegando el siguiente código:

#!/bin/bash

#by TL

# Request node file and verify that it exists
while true; do
    read -p "Enter the path to the nodes file: " NODES_FILE
    if [[ -f "$NODES_FILE" ]]; then
        break  
    else
        echo "Error: The node file does not exist at the specified path. Please enter a valid path."
    fi
done

# Request package file and verify that it exists
while true; do
    read -p "Enter the path to the package file: " PACKAGES_FILE
    if [[ -f "$PACKAGES_FILE" ]]; then
        break  
    else
        echo "Error: The package file does not exist at the specified path. Please enter a valid path."
    fi
done

# SSH user and password to connect to the nodes
USER="root"
read -sp "Enter the root password for the nodes: " ROOT_PASS
echo

# Proxmox Repository Type
echo "Do you want to use the Enterprise or No-Subscription repositories for Proxmox?"
echo "1) Enterprise"
echo "2) No-Subscription"
read -p "Choose an option (1 o 2): " REPO_OPTION

# Ask for Ceph version
echo "Which version of Ceph do you want to use?"
echo "1) Ceph Reef"
echo "2) Ceph Quincy"
read -p "Choose an option (1 o 2): " CEPH_VERSION

# Defining Proxmox repositories for Bookworm
NOSUB_REPO="deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription"
ENTERPRISE_REPO="deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise"

# Define Ceph repositories for Bookworm based on the selected version
if [[ "$CEPH_VERSION" -eq 1 ]]; then
    if [[ "$REPO_OPTION" -eq 1 ]]; then
        CEPH_REPO="deb https://enterprise.proxmox.com/debian/ceph-reef bookworm enterprise"
    else
        CEPH_REPO="deb http://download.proxmox.com/debian/ceph-reef bookworm no-subscription"
    fi
elif [[ "$CEPH_VERSION" -eq 2 ]]; then
    if [[ "$REPO_OPTION" -eq 1 ]]; then
        CEPH_REPO="deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise"
    else
        CEPH_REPO="deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription"
    fi
else
    echo "Invalid Ceph version option. Exiting..."
    exit 1
fi

# Read the list of packages from the provided file
PACKAGES=()
while IFS= read -r package; do
  PACKAGES+=("$package")
done < "$PACKAGES_FILE"

# Installing the packages
INSTALL_CMD="apt-get update && apt-get install -y ${PACKAGES[@]}"

# Function to process each node
process_node() {
    local hostname=$1
    local ip=$2

    echo "Connecting to $hostname ($ip)..."

    if [[ "$REPO_OPTION" -eq 1 ]]; then
        echo "Switching to Enterprise Repositories in $hostname ($ip)..."
        sshpass -p "$ROOT_PASS" ssh -o StrictHostKeyChecking=no "$USER@$ip" "\
            sed -i '/deb http:\/\/download.proxmox.com\/debian\/pve bookworm pve-no-subscription/d' /etc/apt/sources.list; \
            rm -f /etc/apt/sources.list.d/pve-no-subscription.list; \
            rm -f /etc/apt/sources.list.d/ceph.list; \
            echo '$ENTERPRISE_REPO' > /etc/apt/sources.list.d/pve-enterprise.list; \
            echo '$CEPH_REPO' > /etc/apt/sources.list.d/ceph.list; \
            apt-get update" &
    else
        echo "Switching to No-Subscription Repositories in $hostname ($ip)..."
        sshpass -p "$ROOT_PASS" ssh -o StrictHostKeyChecking=no "$USER@$ip" "\
            sed -i '/deb http:\/\/download.proxmox.com\/debian\/pve bookworm pve-no-subscription/d' /etc/apt/sources.list; \
            rm -f /etc/apt/sources.list.d/pve-enterprise.list; \
            rm -f /etc/apt/sources.list.d/ceph.list; \
            echo '$NOSUB_REPO' > /etc/apt/sources.list.d/pve-no-subscription.list; \
            echo '$CEPH_REPO' > /etc/apt/sources.list.d/ceph.list; \
            apt-get update" &
    fi

    # Wait a few seconds to make sure the changes are applied.
    sleep 5

    # Installing the packages
    echo "Installing packages on $hostname ($ip)..."
    sshpass -p "$ROOT_PASS" ssh -o StrictHostKeyChecking=no "$USER@$ip" "$INSTALL_CMD"
}

# Read the node file and process each node in parallel
while IFS=' ' read -r hostname ip; do
    [[ -z "$hostname" || -z "$ip" ]] && continue  
    process_node "$hostname" "$ip" &
done < "$NODES_FILE"

# Wait for all background processes to finish
wait

echo "Completion of the process."

Le damos permisos con chmod +x install-packets.sh y lo ejecutamos ./install-packets.sh obteniendo la siguiente salida

instalar paquetes proxmox de forma masiva

Es un script muy versátil que podéis adaptar a otras versiones de Proxmox o a otros sistemas.

Testearlo antes en un laboratorio para entender como funciona.

Felices fiestas.

Gracias por leer nuestros posts.

No hay comentarios

Comenta la entrada