Raclette/functions/configmgmt
2024-08-30 00:36:29 +02:00

85 lines
3.2 KiB
Bash

#!/usr/bin/env bash
readonly CONFIG_ROOT="/srv/ansible/playbooks"
function config_help() {
cat << EOF
$(basename ${0}) config <command> [...]
commands:
$(basename ${0}) config help
$(basename ${0}) config configure
$(basename ${0}) config pull
$(basename ${0}) config full
$(basename ${0}) config single [playbook]
EOF
}
# Pulls all ansible playbooks from the remote git repo
function config_pull() {
git -C "$CONFIG_ROOT" pull
}
# Executes an ansible-playbook on top.ansible.yml
function config_full() {
ansible-playbook $([[ $debuglevel -eq 4 ]] && echo '-v') $([[ $dryrun -eq 1 ]] && echo '-C') -D "${CONFIG_ROOT}/top.ansible.yml"
}
# Execute on a single playbook ansible-playbook
function config_single() {
local path="$CONFIG_ROOT/${1/\./\/}" # replace dots in path with forward-slashes
local newpath="$path" # set $newpath to $path for later checking
# Check if $path is a directory => add init.ansible.yml
if [[ -d "$path" ]]; then
newpath="$path/init.ansible.yml"
fi
# Check if $path is a file => add .ansible.yml
if [[ -f "${path}.ansible.yml" ]]; then
newpath="${path}.ansible.yml"
fi
# Check if original $path still matches with $newpath => Fail due to unknown module
if [[ "$path" == "$newpath" ]]; then
echo "Module '$1' not found"
exit 1
fi
ansible-playbook $([[ $debuglevel -eq 4 ]] && echo '-v') $([[ $dryrun -eq 1 ]] && echo '-C') -D "$newpath"
}
function config_configure() {
# Check if serverspecific.ansible.yml exists, if not: create
if [[ ! -f "$CONFIG_ROOT/serverspecific.ansible.yml" ]]; then
touch "$CONFIG_ROOT/serverspecific.ansible.yml"
fi
# Check if 'serverspecific' is inside top.ansible.yml, if not: append
if [[ -z $(grep "serverspecific" "$CONFIG_ROOT/top.ansible.yml") ]]; then
echo "- import_playbook: serverspecific.ansible.yml" >> "$CONFIG_ROOT/top.ansible.yml"
fi
available_playbooks=($(find "$CONFIG_ROOT" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | grep -vE "^\.[a-z]+"))
available_playbooks+=($(find "$CONFIG_ROOT" -mindepth 1 -maxdepth 1 -type f -exec basename {} \; | grep -vE "^\.[a-z]+" | grep -v "top.*" | grep -v "map." | grep -v "serverspecific."))
top_content=($(cat "$CONFIG_ROOT/top.ansible.yml" | cut -d: -f2 | cut -d/ -f1 | awk '{$1=$1};1'))
echo "${available_playbooks[@]}"
for top_item in ${top_content[@]}; do
available_playbooks=( $(echo "${available_playbooks[@]/$top_item}" | awk '{$1=$1};1') )
done
echo "${available_playbooks[@]}"
local dialog_string
for playbook in "${available_playbooks[@]}"; do
[[ $(grep "$playbook" "$CONFIG_ROOT/serverspecific.ansible.yml") ]] && playbook="$playbook:on" || playbook="$playbook:off"
echo "$playbook"
dialog_string="${dialog_string} $(echo $playbook | cut -d: -f1) .. $(echo $playbook | cut -d: -f2)"
done
selected=($(dialog --output-fd 1 --clear --title "Select additional playbooks to apply" --checklist "available playbooks" 10 70 3 $dialog_string))
if [[ -n "${selected[@]}" ]]; then
rm -f "$CONFIG_ROOT/serverspecific.ansible.yml"
for sel in "${selected[@]}"; do
echo "- import_playbook: $sel/init.ansible.yml" >> "$CONFIG_ROOT/serverspecific.ansible.yml"
done
fi
}