#!/usr/bin/env bash # ─────────────────────────────────────────────────────────── # build-ansible.sh — Build the Ansible Control Node Image # # Produces a Docker image with Ansible + all collections # for Windows, Cisco, VMware, MSSQL, and Linux targets. # # Can be deployed on: # • Docker Swarm / Kubernetes (native) # • Alpine Docker Host on QEMU (docker pull + run) # • Any Linux with Docker # # Usage: # ./scripts/build-ansible.sh # local build # ./scripts/build-ansible.sh --push # build + push to registry # REGISTRY=my-registry ./scripts/build-ansible.sh --push # ─────────────────────────────────────────────────────────── set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" IMAGE_NAME="${IMAGE_NAME:-ansible-node}" DOCKERFILE="${DOCKERFILE:-Dockerfile.ansible}" REGISTRY="${REGISTRY:-}" TAG="${TAG:-latest}" # ── Colour helpers ────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; BLUE='\033[0;34m' BOLD='\033[1m'; NC='\033[0m' info() { echo -e "${BLUE}[*]${NC} $*"; } ok() { echo -e "${GREEN}[✓]${NC} $*"; } err() { echo -e "${RED}[✗]${NC} $*"; } # ── Build ─────────────────────────────────────────────────── echo "" echo -e "${BOLD}══════════════════════════════════════════════${NC}" echo -e "${BOLD} Ansible Control Node — Docker Image Builder${NC}" echo -e "${BOLD}══════════════════════════════════════════════${NC}" echo "" FULL_IMAGE="${REGISTRY:+${REGISTRY}/}${IMAGE_NAME}:${TAG}" info "Building: ${FULL_IMAGE}" docker build \ -t "$FULL_IMAGE" \ -f "$PROJECT_DIR/${DOCKERFILE}" \ "$PROJECT_DIR" ok "Image built: ${FULL_IMAGE}" # ── Size report ───────────────────────────────────────────── echo "" info "Image layers:" docker history "$FULL_IMAGE" --human --no-trunc | head -6 echo "" IMAGE_SIZE=$(docker image inspect "$FULL_IMAGE" --format='{{.Size}}' | \ awk '{printf "%.0f MB", $1/1024/1024}') ok "Total image size: ${IMAGE_SIZE}" # ── Optional: push ────────────────────────────────────────── if [[ "${1:-}" == "--push" ]]; then if [ -z "$REGISTRY" ]; then err "Set REGISTRY env var to push (e.g., REGISTRY=my-registry)" exit 1 fi info "Pushing: ${FULL_IMAGE}" docker push "$FULL_IMAGE" ok "Pushed: ${FULL_IMAGE}" fi # ── Usage hint ────────────────────────────────────────────── echo "" echo -e "${BOLD}Usage examples:${NC}" echo "" echo " # Run locally with mounted playbooks:" echo " docker run --rm \\" echo " -v \$(pwd)/playbooks:/ansible/playbooks \\" echo " -v \$(pwd)/inventory.ini:/ansible/inventory/inventory.ini \\" echo " ${FULL_IMAGE} site.yml" echo "" echo " # Pull into Alpine Docker Host:" echo " sshpass -p ansible ssh -p 2222 ansible@localhost \\" echo " docker pull ${FULL_IMAGE}" echo "" echo " # Shell into image:" echo " docker run --rm -it ${FULL_IMAGE} --help" echo ""