Add Ansible image builder script
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
#!/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 ""
|
||||
Reference in New Issue
Block a user