Module 1 : Architecture & Installation Katello
Objectifs du module
Durée estimée : 1 heure - 🏗️ Comprendre l'architecture Katello (Foreman, Pulp, Candlepin, Smart Proxies) - 💾 Connaître les prérequis matériels et logiciels - 💻 Installer Katello sur Rocky Linux 9 - 🔧 Configurer le firewall et SELinux - ✅ Valider l'installation et accéder à l'interface Web
📘 Concept : La Stack Katello
⚠️ Stop running yum update manually
Scénario problématique (Infrastructure de 500 serveurs RHEL/Rocky Linux) :
Le problème : Chaque administrateur exécute
yum updatemanuellement sur ses serveurs.❌ Inconvénients : - Aucun contrôle de version : Le serveur Dev a kernel 5.14.0-400, Prod a 5.14.0-362 (incohérence) - Pas de test avant Prod : Une mise à jour défectueuse casse directement la production - Bande passante saturée : 500 serveurs × 200 MB de mises à jour/mois = 100 GB téléchargés depuis Internet - Pas de reporting : Impossible de savoir quels serveurs sont patchés ou vulnérables (CVE) - Pas de rollback : Si un kernel plante, impossible de revenir en arrière facilement
La solution : Katello 🦁
Katello est une solution open source de gestion du cycle de vie des contenus Linux (équivalent de Red Hat Satellite 6).
✅ Avantages : - Centralisation : 1 seul serveur synchronise les repos upstream → redistribue en interne - Lifecycle Management : Dev → Test → Prod (promotion contrôlée) - Content Views : Snapshots versionnés de repos (ex: "Rocky-9-Base-v1.2") - Errata Management : Suivi des CVE et application ciblée - Économie de bande passante : Téléchargement unique + distribution LAN - Reporting : Dashboard de conformité (% serveurs patchés)
🏗️ Architecture : Les Composants
Katello est une stack de 4 composants principaux :
flowchart TB
UPSTREAM[Upstream Repos<br/>Internet<br/>RHEL/CentOS/Rocky/EPEL]
KATELLO[Katello Server<br/>katello.example.com]
FOREMAN[Foreman<br/>Lifecycle Management<br/>Web UI / API]
PULP[Pulp<br/>Repository Storage<br/>RPM Sync & Mirror]
CANDLEPIN[Candlepin<br/>Subscription Management<br/>Entitlements]
POSTGRES[PostgreSQL<br/>Database<br/>Metadata]
LIBRARY[Library<br/>Latest Content]
DEV[Dev Environment<br/>Content View v1.0]
TEST[Test Environment<br/>Content View v1.0]
PROD[Prod Environment<br/>Content View v1.0]
CLIENTS[Clients Rocky Linux<br/>500 servers]
UPSTREAM -->|1. Sync RPM| PULP
PULP --> POSTGRES
CANDLEPIN --> POSTGRES
FOREMAN --> PULP
FOREMAN --> CANDLEPIN
FOREMAN --> POSTGRES
PULP --> LIBRARY
LIBRARY -->|2. Publish| DEV
DEV -->|3. Promote| TEST
TEST -->|4. Promote| PROD
PROD -->|5. subscription-manager| CLIENTS
KATELLO -.-> FOREMAN
KATELLO -.-> PULP
KATELLO -.-> CANDLEPIN
style UPSTREAM fill:#2196F3,color:#fff
style KATELLO fill:#4CAF50,color:#fff
style FOREMAN fill:#FF9800800800,color:#000
style PULP fill:#FF9800800800,color:#fff
style CANDLEPIN fill:#f44336,color:#fff
style LIBRARY fill:#9C27B0,color:#fff
style DEV fill:#FF9800800800,color:#000
style TEST fill:#FF9800800800,color:#fff
style PROD fill:#f44336,color:#fff
style CLIENTS fill:#4CAF50,color:#fff
1️⃣ Foreman (Lifecycle Management)
Rôle : Gestion du cycle de vie des contenus et des hôtes.
- 🌐 Interface Web : Dashboard, gestion des hôtes, rapports
- 🔄 Lifecycle Environments : Library → Dev → Test → Prod
- 📊 Reporting : Conformité, errata applicables, packages obsolètes
- 🤖 Remote Execution : Lancer des commandes sur les clients (via SSH)
- 📡 Provisioning : Déployer des OS (PXE, Kickstart) - optionnel
URL : https://katello.example.com (port 443)
2️⃣ Pulp (Repository Storage)
Rôle : Synchronisation et stockage des repos RPM.
- 🔄 Sync : Télécharge les RPM depuis les repos upstream (mirror local)
- 📦 Storage : Stocke les packages RPM sur disque (
/var/lib/pulp) - 🌐 Publication : Expose les repos via HTTP pour les clients
- 🔐 Checksums : Vérifie l'intégrité des RPM (SHA256)
Stockage typique : 100-500 GB pour RHEL/Rocky complet (BaseOS + AppStream + EPEL)
3️⃣ Candlepin (Subscription Management)
Rôle : Gestion des abonnements et entitlements (équivalent Red Hat CDN pour Satellite).
- 🔑 Activation Keys : Clés pour enregistrer automatiquement les clients
- 📜 Subscriptions : Associer des repos à des hôtes (via Content Views)
- 👥 Host Collections : Groupes d'hôtes pour actions en masse
Note : Pour Rocky Linux (gratuit), Candlepin gère les "pseudo-subscriptions" (pas de licence payante).
4️⃣ PostgreSQL (Database)
Rôle : Stockage des métadonnées (hôtes, repos, errata, etc.).
- 📊 Taille typique : 10-50 GB selon le nombre de repos et d'hôtes
- 🔧 Optimisations : Tuning recommandé pour >1000 hôtes
🌍 Workflow : De l'Upstream à la Production
Étapes :
- Sync : Katello synchronise les repos upstream (ex: Rocky Linux BaseOS)
- Library : Les RPM sont stockés dans l'environnement "Library" (dernière version)
- Content View : L'admin crée une Content View "Rocky-9-Base" (snapshot de repos)
- Publish : La Content View est publiée (version 1.0)
- Promote Dev : La version 1.0 est promue dans l'environnement "Dev"
- Tests : Les serveurs Dev testent les mises à jour pendant 48h
- Promote Test : Si OK, promotion vers "Test" (validation pre-prod)
- Promote Prod : Si OK, promotion vers "Prod" (déploiement final)
- Installation : Les clients exécutent
yum update(récupèrent depuis Katello, pas Internet)
💡 Avantage : Chaque environnement a une version figée des repos. Prod ne change pas tant que l'admin ne le décide pas.
💻 Pratique : Installation sur Rocky Linux 9
📋 Prérequis matériels
It's heavy!
Katello est une stack gourmande en ressources. Ne sous-estimez pas les besoins matériels.
Ressources minimales :
| Composant | Minimum | Recommandé |
|---|---|---|
| CPU | 4 vCPU | 8 vCPU |
| RAM | 16 GB | 32 GB |
| Disk | 200 GB | 500 GB+ (selon nb de repos) |
| OS | Rocky Linux 9 | Rocky Linux 9.3+ |
Disk Layout recommandé :
/: 50 GB (OS)/var/lib/pulp: 300+ GB (stockage RPM)/var/lib/pgsql: 50 GB (PostgreSQL)- Swap : 8 GB
💡 Conseil : Utilisez un volume LVM pour /var/lib/pulp (facile à étendre).
🖥️ Prérequis système
# Vérifier le hostname (FQDN obligatoire)
hostnamectl
# Output attendu : katello.example.com
# Si incorrect, configurer le FQDN
hostnamectl set-hostname katello.example.com
# Vérifier la résolution DNS
ping -c 2 katello.example.com
# Doit résoudre vers l'IP du serveur (ex: 192.168.1.10)
# Ajouter dans /etc/hosts si DNS non configuré
echo "192.168.1.10 katello.example.com katello" >> /etc/hosts
# Vérifier les ressources
free -h
# Total memory : >= 16 GB
df -h
# /var/lib/pulp : >= 200 GB libre
Hostname FQDN obligatoire
Katello nécessite un FQDN (ex: katello.example.com). Un simple hostname (katello) provoquera des erreurs SSL.
📦 Étape 1 : Installation des repos
# Mettre à jour le système
dnf update -y
# Installer EPEL (Extra Packages for Enterprise Linux)
dnf install -y epel-release
# Activer PowerTools (requis pour certaines dépendances)
dnf config-manager --set-enabled crb
# Installer le repository Foreman
dnf install -y https://yum.theforeman.org/releases/3.9/el9/x86_64/foreman-release.rpm
# Installer le repository Katello
dnf install -y https://yum.theforeman.org/katello/4.11/katello/el9/x86_64/katello-repos-latest.rpm
# Installer les modules Ruby et PostgreSQL
dnf module enable -y ruby:3.1 postgresql:13
# Vérifier les repos activés
dnf repolist | grep -E "foreman|katello"
# Output attendu :
# foreman Foreman 3.9
# katello Katello 4.11
🔧 Étape 2 : Installation de Katello
# Installer le package principal
dnf install -y foreman-installer-katello
# L'installation télécharge ~500 MB de packages
# Durée : 5-10 minutes selon la connexion
🚀 Étape 3 : Lancer l'installateur
# Lancer l'installateur avec le scénario Katello
foreman-installer --scenario katello
# Durée : 20-40 minutes
# L'installateur va :
# - Configurer PostgreSQL (base foreman + candlepin + pulp)
# - Installer Apache + Passenger (Ruby web server)
# - Configurer Pulp (services pulpcore-api, pulpcore-content, pulpcore-worker)
# - Configurer Candlepin (service tomcat)
# - Générer les certificats SSL (CA auto-signée)
# - Créer l'utilisateur admin
# Output final attendu :
# Success!
# * Foreman is running at https://katello.example.com
# Initial credentials are admin / MJxK3vN8zPqR6wT2
# * To install an additional Foreman proxy on separate machine continue by running:
# foreman-proxy-certs-generate --foreman-proxy-fqdn "$FOREMAN_PROXY"
# * Katello is running at https://katello.example.com/katello
# The full log is at /var/log/foreman-installer/katello.log
Mot de passe admin
Le mot de passe admin est généré aléatoirement. Notez-le immédiatement ! Il est affiché à la fin de l'installation.
🔥 Étape 4 : Configuration du firewall
# Katello nécessite plusieurs ports ouverts :
# - 80/443 : HTTP/HTTPS (Web UI + API)
# - 5647 : qpid (client registration)
# - 8140 : Puppet (optionnel, pour provisioning)
# - 9090 : Smart Proxy (optionnel, pour multi-sites)
# Si firewalld est actif :
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=5647/tcp
firewall-cmd --permanent --add-port=8140/tcp
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --reload
# Vérifier
firewall-cmd --list-all
🔒 Étape 5 : Vérifier SELinux
# Katello fonctionne avec SELinux en mode Enforcing (recommandé)
getenforce
# Output attendu : Enforcing
# Si SELinux est en Permissive, le laisser ainsi pour le moment
# (Enforcing peut poser problème si mal configuré)
# Vérifier les contextes SELinux Katello
semanage fcontext -l | grep pulp
# Output attendu : /var/lib/pulp(/.*)? avec type httpd_sys_rw_content_t
✅ Étape 6 : Vérifier les services
# Vérifier que tous les services sont démarrés
foreman-maintain service status
# Output attendu (exemple) :
# foreman.service active
# httpd.service active
# postgresql.service active
# pulpcore-api.service active
# pulpcore-content.service active
# pulpcore-worker@1.service active
# pulpcore-worker@2.service active
# tomcat.service active (Candlepin)
🌐 Étape 7 : Accéder à l'interface Web
# Récupérer l'URL et les credentials (si oubliés)
cat /etc/foreman-installer/scenarios.d/katello-answers.yaml | grep initial_admin_password
# Output : initial_admin_password: MJxK3vN8zPqR6wT2
# Ouvrir un navigateur et accéder à :
# https://katello.example.com
# Connexion :
# Username : admin
# Password : MJxK3vN8zPqR6wT2 (mot de passe généré)
Certificat SSL auto-signé
Par défaut, Katello utilise un certificat auto-signé. Le navigateur affichera un avertissement. Acceptez l'exception de sécurité (ou configurez un certificat Let's Encrypt).
Exercice : À Vous de Jouer
Mise en Pratique : First Launch - Installation Katello
Objectif : Installer et configurer Katello sur un serveur Rocky Linux 9.
Contexte : Vous êtes administrateur système chez LinuxCorp, une entreprise de 200 serveurs Rocky Linux 9. Le DSI vous demande de déployer une solution de gestion centralisée des mises à jour. Vous décidez de tester Katello sur une VM de laboratoire avant le déploiement production.
Tâches à réaliser :
- Préparer un serveur Rocky Linux 9 avec les ressources adéquates
- Vérifier les prérequis (hostname FQDN, résolution DNS, ressources)
- Installer les repos Foreman et Katello
- Exécuter l'installateur
foreman-installer --scenario katello - Configurer le firewall (ports 80, 443, 5647, 8140, 9090)
- Accéder à l'interface Web HTTPS
- Vérifier que tous les services sont actifs
Critères de validation :
- [ ] Hostname FQDN résolu en DNS
- [ ] Services Foreman/Katello actifs
- [ ] Interface Web accessible en HTTPS
- [ ] Firewall configuré avec les ports requis
📝 Travail à réaliser
Créez un script install-katello.sh qui automatise l'installation complète :
#!/bin/bash
# install-katello.sh
# Auteur : Votre nom
# Date : 22/11/2025
# Description : Installation automatisée de Katello sur Rocky Linux 9
#Requires: Root privileges
# TODO 1 : Vérifier que l'on est root
# TODO 2 : Vérifier le hostname FQDN
# TODO 3 : Vérifier les ressources (RAM >= 16 GB)
# TODO 4 : Mettre à jour le système
# TODO 5 : Installer EPEL + PowerTools
# TODO 6 : Installer les repos Foreman et Katello
# TODO 7 : Activer les modules Ruby et PostgreSQL
# TODO 8 : Installer foreman-installer-katello
# TODO 9 : Configurer le firewall (80, 443, 5647, 8140, 9090)
# TODO 10 : Lancer l'installateur
# TODO 11 : Afficher les credentials et l'URL
✅ Critères de validation
| Critère | Vérification |
|---|---|
| Hostname FQDN | hostnamectl → katello.example.com |
| RAM >= 16 GB | free -h → Total >= 16 GB |
| Repos installés | dnf repolist | grep katello → katello-4.11 |
| Installation réussie | /var/log/foreman-installer/katello.log → "Success!" |
| Firewall configuré | firewall-cmd --list-ports → 80, 443, 5647, 8140, 9090 |
| Services actifs | foreman-maintain service status → tous "active" |
| Web UI accessible | curl -k https://katello.example.com → HTTP 200 |
💡 Solution complète
Cliquez pour révéler la solution
#!/bin/bash
# install-katello.sh
# Installation automatisée de Katello sur Rocky Linux 9
# Auteur : ShellBook Training
# Date : 22/11/2025
set -e # Arrêter en cas d'erreur
# ============================================
# VÉRIFICATIONS PRÉALABLES
# ============================================
echo "========================================="
echo " INSTALLATION KATELLO - ROCKY LINUX 9 "
echo "========================================="
echo ""
# CHECK 1 : Root
if [ "$EUID" -ne 0 ]; then
echo "❌ Ce script doit être exécuté en tant que root."
exit 1
fi
echo "✅ CHECK 1 : Droits root OK"
# CHECK 2 : Hostname FQDN
HOSTNAME=$(hostname -f)
if [[ ! "$HOSTNAME" =~ \. ]]; then
echo "❌ CHECK 2 : Hostname doit être un FQDN (ex: katello.example.com)"
echo " Hostname actuel : $HOSTNAME"
echo " Configurer avec : hostnamectl set-hostname katello.example.com"
exit 1
fi
echo "✅ CHECK 2 : Hostname FQDN OK ($HOSTNAME)"
# CHECK 3 : RAM >= 16 GB
TOTAL_RAM=$(free -g | awk '/^Mem:/ {print $2}')
if [ "$TOTAL_RAM" -lt 15 ]; then
echo "⚠️ CHECK 3 : RAM insuffisante ($TOTAL_RAM GB, minimum 16 GB)"
echo " L'installation peut échouer ou être très lente."
read -p "Continuer quand même ? (O/N) " CONTINUE
if [ "$CONTINUE" != "O" ]; then
exit 1
fi
else
echo "✅ CHECK 3 : RAM suffisante ($TOTAL_RAM GB)"
fi
# CHECK 4 : Espace disque >= 200 GB
DISK_FREE=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
if [ "$DISK_FREE" -lt 200 ]; then
echo "⚠️ CHECK 4 : Espace disque insuffisant ($DISK_FREE GB, recommandé 200+ GB)"
read -p "Continuer quand même ? (O/N) " CONTINUE
if [ "$CONTINUE" != "O" ]; then
exit 1
fi
else
echo "✅ CHECK 4 : Espace disque OK ($DISK_FREE GB)"
fi
# ============================================
# MISE À JOUR DU SYSTÈME
# ============================================
echo ""
echo "[1/7] Mise à jour du système..."
dnf update -y
# ============================================
# INSTALLATION DES REPOS
# ============================================
echo ""
echo "[2/7] Installation des repositories..."
# EPEL
dnf install -y epel-release
# PowerTools (CRB)
dnf config-manager --set-enabled crb
# Foreman
dnf install -y https://yum.theforeman.org/releases/3.9/el9/x86_64/foreman-release.rpm
# Katello
dnf install -y https://yum.theforeman.org/katello/4.11/katello/el9/x86_64/katello-repos-latest.rpm
# Activer les modules
dnf module enable -y ruby:3.1 postgresql:13
echo "✅ Repositories installés"
# ============================================
# INSTALLATION DE KATELLO
# ============================================
echo ""
echo "[3/7] Installation du package foreman-installer-katello..."
dnf install -y foreman-installer-katello
echo "✅ Package installé"
# ============================================
# CONFIGURATION FIREWALL
# ============================================
echo ""
echo "[4/7] Configuration du firewall..."
# Vérifier si firewalld est actif
if systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=5647/tcp
firewall-cmd --permanent --add-port=8140/tcp
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --reload
echo "✅ Firewall configuré"
else
echo "ℹ️ Firewalld non actif (skip)"
fi
# ============================================
# LANCEMENT DE L'INSTALLATEUR
# ============================================
echo ""
echo "[5/7] Lancement de l'installateur Katello..."
echo "⏳ Cette opération peut prendre 20-40 minutes."
echo ""
# Lancer l'installateur et capturer le mot de passe
foreman-installer --scenario katello 2>&1 | tee /tmp/katello-install.log
# ============================================
# EXTRACTION DES CREDENTIALS
# ============================================
echo ""
echo "[6/7] Extraction des credentials..."
# Extraire le mot de passe du log
ADMIN_PASSWORD=$(grep "Initial credentials are admin" /tmp/katello-install.log | awk '{print $NF}')
if [ -z "$ADMIN_PASSWORD" ]; then
echo "⚠️ Impossible d'extraire le mot de passe automatiquement."
echo " Consultez le fichier : /var/log/foreman-installer/katello.log"
else
echo "✅ Mot de passe admin : $ADMIN_PASSWORD"
fi
# ============================================
# VÉRIFICATION DES SERVICES
# ============================================
echo ""
echo "[7/7] Vérification des services..."
# Vérifier tous les services
foreman-maintain service status > /tmp/services-status.txt
# Compter les services actifs
ACTIVE_SERVICES=$(grep -c "active" /tmp/services-status.txt || true)
echo "✅ $ACTIVE_SERVICES services actifs"
# ============================================
# RÉSUMÉ FINAL
# ============================================
echo ""
echo "========================================="
echo " INSTALLATION TERMINÉE ! "
echo "========================================="
echo ""
echo "🌐 URL : https://$HOSTNAME"
echo "👤 Username : admin"
echo "🔑 Password : $ADMIN_PASSWORD"
echo ""
echo "📝 Prochaines étapes :"
echo " 1. Accéder à l'interface Web"
echo " 2. Accepter le certificat SSL (auto-signé)"
echo " 3. Se connecter avec admin / $ADMIN_PASSWORD"
echo " 4. Explorer le dashboard"
echo ""
echo "📄 Logs complets : /var/log/foreman-installer/katello.log"
echo "========================================="
Exécution :
Output attendu (extrait) :
=========================================
INSTALLATION KATELLO - ROCKY LINUX 9
=========================================
✅ CHECK 1 : Droits root OK
✅ CHECK 2 : Hostname FQDN OK (katello.example.com)
✅ CHECK 3 : RAM suffisante (32 GB)
✅ CHECK 4 : Espace disque OK (450 GB)
[1/7] Mise à jour du système...
...
[5/7] Lancement de l'installateur Katello...
⏳ Cette opération peut prendre 20-40 minutes.
...
Success!
* Foreman is running at https://katello.example.com
Initial credentials are admin / MJxK3vN8zPqR6wT2
...
=========================================
INSTALLATION TERMINÉE !
=========================================
🌐 URL : https://katello.example.com
👤 Username : admin
🔑 Password : MJxK3vN8zPqR6wT2
📝 Prochaines étapes :
1. Accéder à l'interface Web
2. Accepter le certificat SSL (auto-signé)
3. Se connecter avec admin / MJxK3vN8zPqR6wT2
4. Explorer le dashboard
🎯 Points clés à retenir
Checklist Module 1
- ✅ Katello = Stack de 4 composants (Foreman + Pulp + Candlepin + PostgreSQL)
- ✅ Workflow : Upstream → Library → Dev → Test → Prod
- ✅ Prérequis : 16+ GB RAM, 200+ GB Disk, FQDN obligatoire
- ✅ Installation :
foreman-installer --scenario katello(20-40 min) - ✅ Firewall : Ports 80, 443, 5647, 8140, 9090
- ✅ Web UI : https://katello.example.com (admin / mot de passe généré)
- ✅ Services clés : httpd, postgresql, pulpcore-*, tomcat
🔗 Ressources complémentaires
- Documentation Katello - Installation
- Foreman Installer Options
- Katello System Requirements
- Red Hat Satellite 6 Docs (équivalent commercial)
➡️ Prochaine étape
Rendez-vous au Module 2 : Gestion du Contenu (Content Views) pour apprendre à : - Synchroniser des repos upstream (Rocky Linux BaseOS, AppStream, EPEL) - Créer des Content Views (snapshots versionnés) - Organiser les Lifecycle Environments (Dev → Test → Prod) - Publier et promouvoir du contenu entre environnements
Citation du formateur
"Installer Katello, c'est comme construire une usine : ça prend 1 jour, mais ça optimise 10 ans de gestion des patchs." — ShellBook Training
Navigation
| ← Programme | Module 2 : Gestion du Contenu - Le Pi... → |