#!/bin/bash # Ansible Playbook Runner Script # Usage: ./run.sh -dev (or any group name) # Set script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" INVENTORY_FILE="$SCRIPT_DIR/inventory.ini" PLAYBOOK_FILE="$SCRIPT_DIR/system-update.yml" # Function to display usage show_usage() { echo "Usage: $0 -" echo "" echo "Examples:" echo " $0 -dev # Run on dev group (dev1, dev2)" echo " $0 -prod # Run on prod group" echo " $0 -all # Run on all hosts" echo "" echo "Available groups in inventory:" grep '^\[' "$INVENTORY_FILE" | grep -v ':vars' | sed 's/\[//g' | sed 's/\]//g' | sort } # Function to check if group exists in inventory check_group_exists() { local group_name="$1" if [ "$group_name" = "all" ]; then return 0 fi if grep -q "^\[$group_name\]" "$INVENTORY_FILE"; then return 0 else return 1 fi } # Function to run ansible playbook run_playbook() { local group_name="$1" echo "=========================================" echo "Running Ansible Playbook on group: $group_name" echo "=========================================" echo "Inventory: $INVENTORY_FILE" echo "Playbook: $PLAYBOOK_FILE" echo "Target: $group_name" echo "=========================================" echo "" # Set environment variables for better output export LANG=C export ANSIBLE_HOST_KEY_CHECKING=False # Run the playbook cd "$SCRIPT_DIR" ansible-playbook -i "$INVENTORY_FILE" "$PLAYBOOK_FILE" --limit "$group_name" -v local exit_code=$? echo "" echo "=========================================" if [ $exit_code -eq 0 ]; then echo "✅ Playbook execution completed successfully!" else echo "❌ Playbook execution failed with exit code: $exit_code" fi echo "=========================================" return $exit_code } # Main script logic main() { # Check if argument is provided if [ $# -eq 0 ]; then echo "❌ Error: No group specified" echo "" show_usage exit 1 fi # Parse argument local arg="$1" if [[ "$arg" =~ ^-(.+)$ ]]; then local group_name="${BASH_REMATCH[1]}" else echo "❌ Error: Invalid argument format. Use -" echo "" show_usage exit 1 fi # Check if files exist if [ ! -f "$INVENTORY_FILE" ]; then echo "❌ Error: Inventory file not found: $INVENTORY_FILE" exit 1 fi if [ ! -f "$PLAYBOOK_FILE" ]; then echo "❌ Error: Playbook file not found: $PLAYBOOK_FILE" exit 1 fi # Check if group exists if ! check_group_exists "$group_name"; then echo "❌ Error: Group '$group_name' not found in inventory" echo "" show_usage exit 1 fi # Run the playbook run_playbook "$group_name" } # Handle help argument if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then show_usage exit 0 fi # Run main function main "$@"