#!/usr/bin/env bash readonly CONFIG_ROOT="/srv/ansible/playbooks" function config_help() { cat << EOF $(basename ${0}) config [...] commands: $(basename ${0}) config help $(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 }