#!/bin/bash # Enterprise Ansible Setup and Test Script # This script sets up the Ansible environment and runs tests set -e # Colors 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" } # Check if we're in the right directory if [ ! -d "ansible" ]; then print_error "ansible directory not found. Please run this script from your project root." exit 1 fi cd ansible print_status "Setting up Enterprise Ansible environment..." # Create necessary directories print_status "Creating directory structure..." mkdir -p group_vars mkdir -p templates mkdir -p roles mkdir -p inventories/production mkdir -p inventories/staging # Install Python dependencies print_status "Installing Python dependencies..." pip3 install --user boto3 botocore jmespath > /dev/null 2>&1 || { print_warning "Could not install Python dependencies. Install manually: pip3 install boto3 botocore jmespath" } # Check Ansible installation if ! command -v ansible &> /dev/null; then print_error "Ansible not found. Please install Ansible first:" echo " Ubuntu/Debian: sudo apt update && sudo apt install ansible" echo " RHEL/CentOS: sudo yum install ansible" echo " macOS: brew install ansible" exit 1 fi ANSIBLE_VERSION=$(ansible --version | head -n1) print_success "Found: $ANSIBLE_VERSION" # Check AWS CLI if ! command -v aws &> /dev/null; then print_error "AWS CLI not found. Please install AWS CLI first." exit 1 fi AWS_VERSION=$(aws --version) print_success "Found: $AWS_VERSION" # Validate configuration files print_status "Validating Ansible configuration files..." # Check if main playbook exists if [ ! -f "configure_ecs.yml" ]; then print_error "configure_ecs.yml not found!" exit 1 fi # Validate YAML syntax if command -v yamllint &> /dev/null; then print_status "Checking YAML syntax..." yamllint configure_ecs.yml || print_warning "YAML syntax issues found (non-critical)" else print_warning "yamllint not found. Install with: pip3 install yamllint" fi # Validate Ansible playbook syntax print_status "Validating Ansible playbook syntax..." ansible-playbook configure_ecs.yml --syntax-check || { print_error "Ansible syntax validation failed!" exit 1 } print_success "Ansible syntax validation passed" # Test functions test_connectivity() { local ip=$1 if [ -z "$ip" ]; then print_error "No IP address provided for connectivity test" return 1 fi print_status "Testing connectivity to $ip..." # Test SSH connectivity if timeout 10 bash -c "nc -z $ip 22" &>/dev/null; then print_success "SSH port (22) is reachable" else print_error "SSH port (22) is not reachable" return 1 fi # Test Ansible ping if ansible inventory_hosts -m ping -i hosts &>/dev/null; then print_success "Ansible connectivity test passed" else print_error "Ansible connectivity test failed" return 1 fi return 0 } # Create a test inventory for validation create_test_inventory() { local ip=${1:-"127.0.0.1"} print_status "Creating test inventory with IP: $ip" cat > hosts_test << EOF [inventory_hosts] test-instance ansible_host=$ip ansible_user=ec2-user [inventory_hosts:vars] ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_common_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10' ansible_python_interpreter=/usr/bin/python3 ansible_connection=ssh aws_region=us-east-2 EOF } # Main execution print_status "Ansible Enterprise Setup Complete!" echo echo "Available operations:" echo " 1. Test connectivity (requires EC2 IP)" echo " 2. Run simple deployment test" echo " 3. Validate all playbooks" echo " 4. Show configuration summary" echo # Interactive mode if [ "$1" == "--interactive" ]; then echo -n "Enter operation number (1-4): " read -r operation case $operation in 1) echo -n "Enter EC2 instance IP: " read -r ec2_ip create_test_inventory "$ec2_ip" if test_connectivity "$ec2_ip"; then print_success "Connectivity test passed!" else print_error "Connectivity test failed!" fi ;; 2) echo -n "Enter EC2 instance IP: " read -r ec2_ip create_test_inventory "$ec2_ip" print_status "Running simple deployment test..." ansible-playbook simple-deploy.yml -i hosts_test -v ;; 3) print_status "Validating all playbooks..." for playbook in *.yml; do if [ -f "$playbook" ]; then print_status "Validating $playbook..." ansible-playbook "$playbook" --syntax-check fi done print_success "All playbooks validated!" ;; 4) print_status "Configuration Summary:" echo " - Working Directory: $(pwd)" echo " - Ansible Version: $(ansible --version | head -n1)" echo " - AWS CLI Version: $(aws --version 2>&1)" echo " - Available Playbooks:" ls -la *.yml 2>/dev/null | awk '{print " - " $9}' || echo " - None found" echo " - Python Dependencies:" python3 -c "import boto3, botocore; print(' - boto3: ' + boto3.__version__); print(' - botocore: ' + botocore.__version__)" 2>/dev/null || echo " - Not installed" ;; *) print_error "Invalid operation number" ;; esac fi # Cleanup if [ -f "hosts_test" ]; then rm -f hosts_test fi print_success "Setup script completed!" echo echo "Next steps:" echo " 1. Update your Jenkins pipeline with the new Ansible integration" echo " 2. Test with: ./setup-ansible.sh --interactive" echo " 3. Run deployment: ansible-playbook configure_ecs.yml -i hosts -v" echo