88 lines
3.7 KiB
Bash
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 ""
|