Files
2026-07-07 17:07:51 +00:00

88 lines
3.7 KiB
Bash

#!/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 ""