#!/bin/bash set -euo pipefail # @TODO long-term, turn this simple bash script into more complex Python Click project SKANSIBLE_SCRIPT_PATH=$(dirname "$0") export ANSIBLE_FORCE_COLOR=True SKANSIBLE_STAGE=0 ANSIBLE_VERBOSITY=0 SKANSIBLE_UNITTEST=False SKANSIBLE_MODE=prod if [[ "$1" == "version" ]]; then echo "26.07" fi if [[ "$1" == "show-defaults" ]]; then source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" printf "Private SSH keys available throufh SSH agent: |\n%s\n" "$(ssh-add -l)" fi if [[ "$1" == "start-agent" ]]; then source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" eval "$(ssh-agent -s)" fi if [[ "$1" == "list-agent" ]]; then source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" ssh-add -l fi if [[ "$1" == "populate-agent" ]]; then shift 1 source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" if [[ "$1" == "all" ]]; then for SKANSIBLE_SSH_KEY in ~/.ssh/*; do case $SKANSIBLE_SSH_KEY in *.pub);; *.old);; *.bak);; */config);; */authorized_keys);; *_hosts);; */agent);; *) ssh-add "${SKANSIBLE_SSH_KEY}";; esac done elif [[ "$1" == "staging" ]]; then SKANSIBLE_SSH_KEY_COLLECTION=(~/.ssh/ed25519\@staging ~/.ssh/ecdsa\@staging ~/.ssh/ed25519-37851076-sk\@staging ~/.ssh/ecdsa-37851076-sk\@staging) shift 1 elif [[ "$1" == "prod" ]]; then SKANSIBLE_SSH_KEY_COLLECTION=(~/.ssh/ed25519\@staging ~/.ssh/ecdsa\@staging ~/.ssh/ed25519-37851076-sk\@staging ~/.ssh/ecdsa-37851076-sk\@staging) shift 1 elif [[ -n "$1" ]]; then # @TODO improve by adding fuzzy querying or file finding pror ssh-add "$1" exit 0 fi for key in "${SKANSIBLE_SSH_KEY_COLLECTION[@]}"; do ssh-add "$key" done exit 0 fi if [[ "$1" == "init" ]]; then shift 1 source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" if [[ "$1" == "vps" ]]; then SKANSIBLE_PLAY_HOST="$1" shift 1 elif [[ "$1" == "homeserver" ]]; then SKANSIBLE_PLAY_HOST="$1" shift 1 else echo "A playbook type must be specified" exit 1 fi while getopts "htd:m:s:n:v:u:" opt; do case $opt in h) Help "init";; s) SKANSIBLE_STAGE="$OPTARG";; n) SKANSIBLE_CONN_HOST="$OPTARG";; v) export ANSIBLE_VERBOSITY="$OPTARG";; t) SKANSIBLE_UNITTEST=True;; u) export ANSIBLE_REMOTE_USER="$OPTARG";; m) SKANSIBLE_MODE="$OPTARG";; d) SKANSIBLE_FQDN="$OPTARG";; *) echo "Err: Invalid option set"; exit 1;; esac done if [ -n "$SKANSIBLE_STAGE" ]; then # SKANSIBLE_CONN_HOST=staging${SKANSIBLE_STAGE}.test if [[ "$SKANSIBLE_STAGE" == 0 ]]; then if [[ "$SKANSIBLE_UNITTEST" == "True" ]]; then sudo ansible-playbook -CKk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-root}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "init@${SKANSIBLE_PLAY_HOST}.yml" else sudo ansible-playbook -Kk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-root}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "init@${SKANSIBLE_PLAY_HOST}.yml" fi elif [[ "$SKANSIBLE_STAGE" == 1 ]]; then if [[ "$SKANSIBLE_UNITTEST" == "True" ]]; then sudo ansible-playbook -CK -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-root}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "init@${SKANSIBLE_PLAY_HOST}.yml" else sudo ansible-playbook -K -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-root}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "init@${SKANSIBLE_PLAY_HOST}.yml" fi fi else if [[ -z "$SKANSIBLE_CONN_HOST" ]] && [[ -z "$SKANSIBLE_FQDN" ]]; then echo "When not doing staging, chosen or preferred host must be made explicit as well as desired FQDN" exit 1 else sudo ansible-playbook -Kk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-root}" --extra-vars "mode=prod" --extra-vars "fqdn=${SKANSIBLE_FQDN}" "init@${SKANSIBLE_PLAY_HOST}.yml" fi fi exit 0 fi if [[ "$1" == "bootstrap" ]]; then shift 1 source "${SKANSIBLE_SCRIPT_PATH}/.venv/bin/activate" if [[ "$1" == "vps" ]]; then SKANSIBLE_PLAY_HOST="$1" shift 1 elif [[ "$1" == "homeserver" ]]; then SKANSIBLE_PLAY_HOST="$1" shift 1 else echo "A playbook type must be specified" exit 1 fi while getopts "htd:m:s:n:v:u:" opt; do case $opt in h) Help "bootstrap";; s) SKANSIBLE_STAGE="$OPTARG";; n) SKANSIBLE_CONN_HOST="$OPTARG";; v) export ANSIBLE_VERBOSITY=4;; t) SKANSIBLE_UNITTEST=True;; u) export ANSIBLE_REMOTE_USER="$OPTARG";; m) SKANSIBLE_MODE="$OPTARG";; d) SKANSIBLE_FQDN="$OPTARG";; *) echo "Err: Invalid option set"; exit 1;; esac done if [ -n "$SKANSIBLE_STAGE" ]; then # SKANSIBLE_CONN_HOST=staging${SKANSIBLE_STAGE}.test if [[ "$SKANSIBLE_STAGE" == 0 ]]; then if [[ "$SKANSIBLE_UNITTEST" == "True" ]]; then ansible-playbook -CKk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-senpai}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "administrate@${SKANSIBLE_PLAY_HOST}.yml" else ansible-playbook -Kk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-senpai}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "administrate@${SKANSIBLE_PLAY_HOST}.yml" fi elif [[ "$SKANSIBLE_STAGE" == 1 ]]; then if [[ "$SKANSIBLE_UNITTEST" == "True" ]]; then ansible-playbook -CK -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-senpai}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "administrate@${SKANSIBLE_PLAY_HOST}.yml" else ansible-playbook -K -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-senpai}" --extra-vars "mode=${SKANSIBLE_MODE}" --extra-vars "fqdn=${SKANSIBLE_FQDN:-staging.test}" "administrate@${SKANSIBLE_PLAY_HOST}.yml" fi fi else if [[ -z "$SKANSIBLE_CONN_HOST" ]]; then echo "When not doing staging, chosen or preferred host must be made explicit as well as desired FQDN" exit 1 else ansible-playbook -Kk -i hosts.yml --extra-vars "chosen_host=${SKANSIBLE_CONN_HOST}" --extra-vars "chosen_user=${ANSIBLE_REMOTE_USER:-senpai}" --extra-vars "mode=prod" --extra-vars "fqdn=${SKANSIBLE_FQDN}" "administrate@${SKANSIBLE_PLAY_HOST}.yml" fi fi exit 0 fi