Erstellen eines automatisierten Bereitstellungsskripts
In diesem Schritt erstellen Sie ein Automatisierungsskript, das demonstriert, wie RHEL-Container konsistent und wiederholt bereitgestellt werden können. Dieses Skript dient dem gleichen Zweck wie die Verwendung von Kickstart-Dateien für die VM-Automatisierung, ist aber für containerisierte RHEL-Bereitstellungen angepasst. Das Skript übernimmt die Image-Erstellung, die Container-Bereitstellung und grundlegende Integritätsprüfungen.
Stellen Sie zunächst sicher, dass Sie sich in Ihrem Projektverzeichnis befinden:
cd ~/project
Erstellen Sie ein Bereitstellungsautomatisierungsskript, das die Automatisierungsfunktionen nachahmt, die Sie mit Kickstart und virt-install
erreichen würden:
nano deploy-rhel-container.sh
Fügen Sie den folgenden Inhalt hinzu, um ein umfassendes Bereitstellungsskript zu erstellen:
#!/bin/bash
## RHEL Container Automated Deployment Script
## This script demonstrates container-based RHEL deployment automation
## Similar to Kickstart automation for VMs, but for containers
set -e ## Exit on any error
## Configuration variables
IMAGE_NAME="rhel9-automated"
IMAGE_TAG="latest"
CONTAINER_NAME="rhel9-production"
HOST_PORT="8080"
CONTAINER_PORT="8080"
DOCKERFILE="rhel9-automated.dockerfile"
## Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' ## No Color
## Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
## Function to check if Docker is running
check_docker() {
print_status "Checking Docker availability..."
if ! docker info > /dev/null 2>&1; then
print_error "Docker is not running or not accessible"
exit 1
fi
print_success "Docker is available"
}
## Function to build the image
build_image() {
print_status "Building RHEL container image..."
if [ ! -f "$DOCKERFILE" ]; then
print_error "Dockerfile '$DOCKERFILE' not found"
exit 1
fi
docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" -f "$DOCKERFILE" .
print_success "Image '${IMAGE_NAME}:${IMAGE_TAG}' built successfully"
}
## Function to stop and remove existing container
cleanup_existing() {
print_status "Checking for existing container..."
if docker ps -a | grep -q "$CONTAINER_NAME"; then
print_warning "Stopping and removing existing container '$CONTAINER_NAME'"
docker stop "$CONTAINER_NAME" > /dev/null 2>&1 || true
docker rm "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
## Function to deploy the container
deploy_container() {
print_status "Deploying RHEL container..."
docker run -d \
--name "$CONTAINER_NAME" \
-p "${HOST_PORT}:${CONTAINER_PORT}" \
--restart unless-stopped \
"${IMAGE_NAME}:${IMAGE_TAG}"
print_success "Container '$CONTAINER_NAME' deployed successfully"
}
## Function to verify deployment
verify_deployment() {
print_status "Verifying container deployment..."
## Wait for container to start
sleep 5
## Check if container is running
if ! docker ps | grep -q "$CONTAINER_NAME"; then
print_error "Container is not running"
docker logs "$CONTAINER_NAME"
exit 1
fi
## Check if web service is responding
print_status "Testing web service..."
for i in {1..10}; do
if curl -s "http://localhost:${HOST_PORT}" > /dev/null; then
print_success "Web service is responding"
break
fi
if [ $i -eq 10 ]; then
print_error "Web service is not responding after 10 attempts"
exit 1
fi
sleep 2
done
}
## Function to display deployment information
show_deployment_info() {
print_success "=== RHEL Container Deployment Complete ==="
echo "Container Name: $CONTAINER_NAME"
echo "Image: ${IMAGE_NAME}:${IMAGE_TAG}"
echo "Port Mapping: ${HOST_PORT}:${CONTAINER_PORT}"
echo "Access URL: http://localhost:${HOST_PORT}"
echo ""
print_status "Container Status:"
docker ps | grep "$CONTAINER_NAME"
echo ""
print_status "Sample Content:"
curl -s "http://localhost:${HOST_PORT}" | head -2
}
## Main deployment process
main() {
echo "=== RHEL Container Automated Deployment ==="
echo "This script automates RHEL container deployment"
echo "Similar to Kickstart automation for traditional installations"
echo ""
check_docker
build_image
cleanup_existing
deploy_container
verify_deployment
show_deployment_info
print_success "Automated RHEL container deployment completed successfully!"
}
## Handle script arguments
case "${1:-deploy}" in
"deploy" | "")
main
;;
"cleanup")
print_status "Cleaning up deployment..."
cleanup_existing
docker rmi "${IMAGE_NAME}:${IMAGE_TAG}" 2> /dev/null || true
print_success "Cleanup completed"
;;
"status")
docker ps | grep "$CONTAINER_NAME" || print_warning "Container not running"
;;
*)
echo "Usage: $0 [deploy|cleanup|status]"
echo " deploy - Build and deploy RHEL container (default)"
echo " cleanup - Stop container and remove image"
echo " status - Show container status"
exit 1
;;
esac
Speichern Sie die Datei und beenden Sie nano (Ctrl+X
, dann Y
, dann Enter
).
Verstehen der Struktur des Bereitstellungsskripts
Bevor Sie das Skript ausführen, wollen wir verstehen, wie dieses Automatisierungsskript funktioniert. Dieser Abschnitt bietet eine detaillierte Erklärung jeder Komponente, wodurch es für Anfänger einfacher wird, Shell-Skripting und Container-Automatisierungskonzepte zu verstehen.
Skript-Header und Fehlerbehandlung
#!/bin/bash
set -e ## Exit on any error
#!/bin/bash
: Dies wird als "Shebang" bezeichnet – es weist das System an, die Bash-Shell zum Ausführen dieses Skripts zu verwenden
set -e
: Dadurch wird das Skript sofort beendet, wenn ein Befehl fehlschlägt, wodurch sichergestellt wird, dass das Skript beim ersten Fehler anhält, anstatt mit einem potenziell fehlerhaften Zustand fortzufahren
Konfigurationsvariablen
## Configuration variables
IMAGE_NAME="rhel9-automated"
IMAGE_TAG="latest"
CONTAINER_NAME="rhel9-production"
HOST_PORT="8080"
CONTAINER_PORT="8080"
DOCKERFILE="rhel9-automated.dockerfile"
Diese Variablen definieren alle Schlüsselparameter für unsere Bereitstellung. Indem wir sie oben platzieren, können wir die Bereitstellungskonfiguration einfach ändern, ohne die Skriptlogik zu ändern. Dies ähnelt der Verwendung von Konfigurationsparametern in Kickstart-Dateien.
Benutzerfreundliches Ausgabesystem
## Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' ## No Color
## Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
Dies erstellt ein professionelles Protokollierungssystem mit farbiger Ausgabe:
\033[0;31m
: ANSI-Escape-Codes für Farben (31 = Rot, 32 = Grün usw.)
echo -e
: Das Flag -e
aktiviert die Interpretation von Backslash-Escapes für Farben
$1
: Bezieht sich auf das erste Argument, das an die Funktion übergeben wird
Kernfunktionen der Bereitstellung
1. Docker-Umgebungsprüfung
check_docker() {
print_status "Checking Docker availability..."
if ! docker info > /dev/null 2>&1; then
print_error "Docker is not running or not accessible"
exit 1
fi
print_success "Docker is available"
}
docker info > /dev/null 2>&1
: Führt docker info
aus und leitet sowohl die Ausgabe (>
) als auch die Fehler (2>&1
) an /dev/null
um (verwirft sie)
!
: Negiert das Ergebnis – wenn docker info
fehlschlägt (gibt einen Wert ungleich Null zurück), wird die Bedingung wahr
- Dies entspricht der Überprüfung, ob Virtualisierung in traditionellen VM-Bereitstellungen verfügbar ist
2. Image-Erstellungsfunktion
build_image() {
print_status "Building RHEL container image..."
if [ ! -f "$DOCKERFILE" ]; then
print_error "Dockerfile '$DOCKERFILE' not found"
exit 1
fi
docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" -f "$DOCKERFILE" .
print_success "Image '${IMAGE_NAME}:${IMAGE_TAG}' built successfully"
}
[ ! -f "$DOCKERFILE" ]
: Testet, ob das Dockerfile NICHT existiert (!
negiert, -f
testet auf Dateiexistenz)
docker build -t
: Erstellt ein Container-Image mit einem Tag (Name:Version)
- Dies ersetzt den traditionellen Installationsprozess von ISO-Medien
3. Bereinigungsfunktion
cleanup_existing() {
print_status "Checking for existing container..."
if docker ps -a | grep -q "$CONTAINER_NAME"; then
print_warning "Stopping and removing existing container '$CONTAINER_NAME'"
docker stop "$CONTAINER_NAME" > /dev/null 2>&1 || true
docker rm "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
docker ps -a | grep -q
: Listet alle Container auf und sucht stillschweigend nach unserem Containernamen
|| true
: Stellt sicher, dass der Befehl immer erfolgreich ist (gibt 0 zurück), auch wenn der Container nicht existiert
- Dies verhindert Konflikte mit bestehenden Bereitstellungen
4. Container-Bereitstellung
deploy_container() {
print_status "Deploying RHEL container..."
docker run -d \
--name "$CONTAINER_NAME" \
-p "${HOST_PORT}:${CONTAINER_PORT}" \
--restart unless-stopped \
"${IMAGE_NAME}:${IMAGE_TAG}"
print_success "Container '$CONTAINER_NAME' deployed successfully"
}
-d
: Führt den Container im Detached-Modus aus (Hintergrund)
-p "${HOST_PORT}:${CONTAINER_PORT}"
: Ordnet den Host-Port dem Container-Port zu
--restart unless-stopped
: Startet den Container automatisch neu, wenn er stoppt (außer bei manuellen Stopps)
\
: Zeilenfortsetzungszeichen für mehrzeilige Befehle
5. Integritätsprüfung
verify_deployment() {
print_status "Verifying container deployment..."
## Wait for container to start
sleep 5
## Check if container is running
if ! docker ps | grep -q "$CONTAINER_NAME"; then
print_error "Container is not running"
docker logs "$CONTAINER_NAME"
exit 1
fi
## Check if web service is responding
print_status "Testing web service..."
for i in {1..10}; do
if curl -s "http://localhost:${HOST_PORT}" > /dev/null; then
print_success "Web service is responding"
break
fi
if [ $i -eq 10 ]; then
print_error "Web service is not responding after 10 attempts"
exit 1
fi
sleep 2
done
}
{1..10}
: Bash-Brace-Expansion – erstellt die Sequenz 1, 2, 3... 10
curl -s
: Silent-Modus-HTTP-Anfrage
break
: Beendet die Schleife frühzeitig, wenn der Dienst antwortet
- Dies implementiert einen Wiederholungsmechanismus mit Timeout
Befehlszeilenschnittstelle
case "${1:-deploy}" in
"deploy" | "")
main
;;
"cleanup")
print_status "Cleaning up deployment..."
cleanup_existing
docker rmi "${IMAGE_NAME}:${IMAGE_TAG}" 2> /dev/null || true
print_success "Cleanup completed"
;;
"status")
docker ps | grep "$CONTAINER_NAME" || print_warning "Container not running"
;;
*)
echo "Usage: $0 [deploy|cleanup|status]"
echo " deploy - Build and deploy RHEL container (default)"
echo " cleanup - Stop container and remove image"
echo " status - Show container status"
exit 1
;;
esac
${1:-deploy}
: Parametererweiterung – verwendet $1
(erstes Argument) oder "deploy" als Standard
case
-Anweisung: Ähnlich wie switch/case in anderen Sprachen
;;
: Beendet jeden Case-Zweig
$0
: Bezieht sich auf den Skriptnamen selbst
Dies erstellt ein vielseitiges Skript, das für mehrere Operationen verwendet werden kann, ähnlich wie Systemadministratoren verschiedene Tools für Bereitstellung, Wartung und Überwachung verwenden.
Machen Sie das Skript ausführbar:
chmod +x deploy-rhel-container.sh
Führen Sie nun das automatisierte Bereitstellungsskript aus, um den vollständigen Automatisierungsprozess zu sehen:
./deploy-rhel-container.sh
Sie sollten eine Ausgabe sehen, die den vollständigen Bereitstellungsprozess zeigt:
=== RHEL Container Automated Deployment ===
This script automates RHEL container deployment
Similar to Kickstart automation for traditional installations
[INFO] Checking Docker availability...
[SUCCESS] Docker is available
[INFO] Building RHEL container image...
[SUCCESS] Image 'rhel9-automated:latest' built successfully
[INFO] Checking for existing container...
[INFO] Deploying RHEL container...
[SUCCESS] Container 'rhel9-production' deployed successfully
[INFO] Verifying container deployment...
[INFO] Testing web service...
[SUCCESS] Web service is responding
[SUCCESS] === RHEL Container Deployment Complete ===
Container Name: rhel9-production
Image: rhel9-automated:latest
Port Mapping: 8080:8080
Access URL: http://localhost:8080
Testen Sie die verschiedenen Skriptoptionen:
./deploy-rhel-container.sh status
Skriptausführungs-Walkthrough
Wenn Sie das Skript ausführen, führt es automatisch die folgende Sequenz aus:
1. Umgebungsvalidierungsphase
Das Skript prüft zuerst, ob Docker verfügbar und zugänglich ist. Dies ist entscheidend, da die Container-Bereitstellung eine funktionierende Docker-Umgebung erfordert, ähnlich wie die VM-Bereitstellung einen funktionierenden Hypervisor erfordert.
2. Image-Erstellungsphase
Das Skript erstellt ein neues Container-Image aus Ihrem Dockerfile. Dieser Prozess:
- Liest die
rhel9-automated.dockerfile
- Lädt das Basis-UBI9-Image herunter, falls es noch nicht vorhanden ist
- Führt jede Anweisung im Dockerfile aus
- Erstellt ein neues Image, das als
rhel9-automated:latest
getaggt ist
3. Bereinigungsphase
Vor der Bereitstellung prüft das Skript, ob ein vorhandener Container mit demselben Namen vorhanden ist, und entfernt ihn. Dies gewährleistet eine saubere Bereitstellung ohne Namenskonflikte.
4. Bereitstellungsphase
Das Skript erstellt und startet den neuen Container mit:
- Detached-Modus: Container wird im Hintergrund ausgeführt
- Port-Mapping: Host-Port 8080 wird dem Container-Port 8080 zugeordnet
- Restart-Richtlinie: Container wird automatisch neu gestartet, wenn er unerwartet stoppt
- Benannter Container: Einfache Identifizierung und Verwaltung
5. Verifizierungsphase
Das Skript führt Integritätsprüfungen durch, um eine erfolgreiche Bereitstellung sicherzustellen:
- Container-Statusprüfung: Überprüft, ob der Container ausgeführt wird
- Dienstverfügbarkeitsprüfung: Testet die HTTP-Dienstantwort
- Wiederholungsmechanismus: Versucht es bis zu 10 Mal mit Intervallen von 2 Sekunden
- Automatische Fehlererkennung: Beendet sich mit einem Fehler, wenn die Überprüfung fehlschlägt
Schließlich zeigt das Skript umfassende Bereitstellungsinformationen an, einschließlich Containerdetails, Zugriffs-URLs und Beispielinhalten.
Praktische Verwendungsbeispiele
Sie können dieses Skript auf verschiedene Arten verwenden:
Normale Bereitstellung:
./deploy-rhel-container.sh
## or explicitly
./deploy-rhel-container.sh deploy
Bereitstellungsstatus prüfen:
./deploy-rhel-container.sh status
Ressourcen bereinigen:
./deploy-rhel-container.sh cleanup
Skripthilfe anzeigen:
./deploy-rhel-container.sh help
Vorteile gegenüber herkömmlichen Methoden
Dieser Automatisierungsansatz bietet mehrere Vorteile gegenüber herkömmlichen Kickstart + VM-Bereitstellungen:
- Geschwindigkeit: Der Container-Start ist typischerweise 10-100x schneller als der VM-Start
- Ressourceneffizienz: Container teilen sich den Host-Kernel und verwenden weniger Speicher und CPU
- Konsistenz: Derselbe Container wird in verschiedenen Umgebungen identisch ausgeführt
- Skalierbarkeit: Einfach, mehrere Instanzen zu erstellen oder horizontal zu skalieren
- Portabilität: Kann auf jedem System mit installiertem Docker ausgeführt werden
- Versionskontrolle: Container-Images können versioniert und in Registries gespeichert werden
Dieses Automatisierungsskript demonstriert, wie moderne containerbasierte RHEL-Bereitstellungen den gleichen Grad an Automatisierung und Konsistenz erreichen können wie herkömmliche Kickstart-basierte VM-Installationen, jedoch mit den zusätzlichen Vorteilen der Containerisierung, wie z. B. schnellerer Bereitstellung, besserer Ressourcenauslastung und einfacherer Skalierung in modernen Cloud-Umgebungen.