From 0975cdc82314a731371a292db4148b74bdb428d7 Mon Sep 17 00:00:00 2001 From: oval Date: Tue, 7 Jul 2026 17:07:51 +0000 Subject: [PATCH] Add Ansible image builder script --- scripts/build-ansible.sh | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 scripts/build-ansible.sh diff --git a/scripts/build-ansible.sh b/scripts/build-ansible.sh new file mode 100644 index 0000000..c9f50a6 --- /dev/null +++ b/scripts/build-ansible.sh @@ -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 ""