From 600c8e9f57ef8085f20f48787bc123f7c6ad1944 Mon Sep 17 00:00:00 2001 From: Damien Arnodo Date: Sun, 16 Nov 2025 15:38:18 +0000 Subject: [PATCH] Add deployment script with interactive menu --- scripts/deploy.sh | 248 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 scripts/deploy.sh diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100644 index 0000000..013fbab --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,248 @@ +#!/bin/bash +# Deployment script for Arista EVPN-VXLAN ContainerLab + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Function to print colored output +print_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to check prerequisites +check_prerequisites() { + print_info "Checking prerequisites..." + + # Check if running as root or with sudo + if [ "$EUID" -ne 0 ]; then + print_error "Please run with sudo" + exit 1 + fi + + # Check if containerlab is installed + if ! command -v containerlab &> /dev/null; then + print_error "ContainerLab is not installed. Please install it first." + print_info "Visit: https://containerlab.dev/install/" + exit 1 + fi + + # Check if docker is running + if ! docker info &> /dev/null; then + print_error "Docker is not running. Please start Docker first." + exit 1 + fi + + # Check if cEOS image exists + if ! docker images | grep -q "ceos.*4.35.0"; then + print_warning "cEOS 4.35.0 image not found." + print_info "Please import the cEOS image first:" + print_info " docker import cEOS64-lab-4.35.0F.tar ceos:4.35.0" + read -p "Do you want to continue anyway? (y/N) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + fi + + print_info "All prerequisites met!" +} + +# Function to deploy the lab +deploy_lab() { + print_info "Deploying Arista EVPN-VXLAN lab..." + + # Deploy with containerlab + if containerlab deploy -t evpn-lab.clab.yml; then + print_info "Lab deployed successfully!" + echo "" + print_info "Lab Details:" + containerlab inspect -t evpn-lab.clab.yml + echo "" + print_info "Access devices using:" + print_info " ssh admin@" + print_info " Default password: admin" + echo "" + print_info "Or use docker exec:" + print_info " docker exec -it clab-arista-evpn-fabric-leaf1 Cli" + else + print_error "Deployment failed!" + exit 1 + fi +} + +# Function to display status +show_status() { + print_info "Lab Status:" + containerlab inspect -t evpn-lab.clab.yml +} + +# Function to destroy the lab +destroy_lab() { + print_warning "This will destroy the entire lab!" + read -p "Are you sure? (y/N) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + print_info "Destroying lab..." + containerlab destroy -t evpn-lab.clab.yml --cleanup + print_info "Lab destroyed successfully!" + else + print_info "Destruction cancelled." + fi +} + +# Function to restart the lab +restart_lab() { + print_info "Restarting lab..." + destroy_lab + if [[ $? -eq 0 ]]; then + sleep 2 + deploy_lab + fi +} + +# Function to show device access info +show_access_info() { + print_info "Device Access Information:" + echo "" + echo "SSH Access (password: admin):" + echo " Spines:" + echo " ssh admin@clab-arista-evpn-fabric-spine1" + echo " ssh admin@clab-arista-evpn-fabric-spine2" + echo "" + echo " Leafs:" + for i in {1..8}; do + echo " ssh admin@clab-arista-evpn-fabric-leaf$i" + done + echo "" + echo "Docker Exec:" + echo " docker exec -it clab-arista-evpn-fabric- Cli" + echo "" + echo "Management IPs:" + containerlab inspect -t evpn-lab.clab.yml | grep -E "spine|leaf" | awk '{print $2, $6}' +} + +# Function to run basic validation +validate_lab() { + print_info "Running basic validation..." + + # Check if containers are running + if ! docker ps | grep -q "clab-arista-evpn-fabric"; then + print_error "No lab containers found. Deploy the lab first." + exit 1 + fi + + print_info "Checking BGP EVPN status on spine1..." + docker exec clab-arista-evpn-fabric-spine1 Cli -p 15 -c "show bgp evpn summary" + + print_info "Checking VXLAN status on leaf1..." + docker exec clab-arista-evpn-fabric-leaf1 Cli -p 15 -c "show vxlan vtep" + + print_info "Checking MLAG status on leaf1..." + docker exec clab-arista-evpn-fabric-leaf1 Cli -p 15 -c "show mlag" + + print_info "Validation complete! Check output above for any issues." +} + +# Main menu +show_menu() { + echo "" + echo "=========================================" + echo " Arista EVPN-VXLAN Lab Manager" + echo "=========================================" + echo "1. Deploy Lab" + echo "2. Show Status" + echo "3. Destroy Lab" + echo "4. Restart Lab" + echo "5. Show Access Info" + echo "6. Validate Lab" + echo "7. Exit" + echo "=========================================" +} + +# Main script +main() { + # Check prerequisites first + check_prerequisites + + # If arguments provided, execute directly + if [ $# -gt 0 ]; then + case "$1" in + deploy) + deploy_lab + ;; + status) + show_status + ;; + destroy) + destroy_lab + ;; + restart) + restart_lab + ;; + access) + show_access_info + ;; + validate) + validate_lab + ;; + *) + print_error "Unknown command: $1" + echo "Usage: $0 {deploy|status|destroy|restart|access|validate}" + exit 1 + ;; + esac + exit 0 + fi + + # Interactive menu + while true; do + show_menu + read -p "Select option [1-7]: " choice + case $choice in + 1) + deploy_lab + ;; + 2) + show_status + ;; + 3) + destroy_lab + ;; + 4) + restart_lab + ;; + 5) + show_access_info + ;; + 6) + validate_lab + ;; + 7) + print_info "Exiting..." + exit 0 + ;; + *) + print_error "Invalid option. Please select 1-7." + ;; + esac + + echo "" + read -p "Press Enter to continue..." + done +} + +# Run main function +main "$@"