From be73219aaa1fad7b35cd6089e6f60ea84e05c2d8 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Thu, 12 Dec 2024 17:57:07 -0500 Subject: [PATCH] feat: fixes not cloning repo when not using a local template directory when setting up a project. --- roles/load-template-vars/tasks/main.yml | 9 +- roles/setup-project/tasks/main.yml | 3 +- scripts/hpa | 284 ++++++++++++++++-------- 3 files changed, 204 insertions(+), 92 deletions(-) diff --git a/roles/load-template-vars/tasks/main.yml b/roles/load-template-vars/tasks/main.yml index fe48361..791694c 100644 --- a/roles/load-template-vars/tasks/main.yml +++ b/roles/load-template-vars/tasks/main.yml @@ -11,12 +11,19 @@ tags: - always +- name: Debug template variable. + ansible.builtin.debug: + var: template + tags: + - debug + - never + - name: Ensure repo. ansible.builtin.git: repo: "{{ template.repo.url }}" dest: "{{ template_dir }}" version: "{{ template.repo.version | default('main') }}" - when: template.repo.url is defined and not template_dir_stat.stat.exists + when: template.repo.url is defined tags: - always diff --git a/roles/setup-project/tasks/main.yml b/roles/setup-project/tasks/main.yml index a49bfdd..ece5dc0 100644 --- a/roles/setup-project/tasks/main.yml +++ b/roles/setup-project/tasks/main.yml @@ -3,7 +3,8 @@ ansible.builtin.debug: msg: "Project dir: {{ project_dir }}" tags: - - always + - setup-project + - never - name: Debug template vars pre parse. ansible.builtin.debug: diff --git a/scripts/hpa b/scripts/hpa index 1e73328..637b508 100755 --- a/scripts/hpa +++ b/scripts/hpa @@ -62,17 +62,6 @@ function load_config() { done } -# NOTE: Assumes you've already called load_config. -function ensure_playbook_dir_from_env_or_fail() { - local dir=${HPA_PLAYBOOK_DIR} - - if [ "$dir" = "" ] || [ ! -d "$dir" ]; then - fail "Env Playbook Dir: Failed to find playbook directory" - fi - - [ ! -f "$dir/$playbook_filename" ] && fail "Env Playbook Dir: could not find playbook file." -} - # NOTE: Assumes playbook_dir and inventory have been setup. function run_playbook() { if [ "$quiet" = "" ]; then @@ -88,28 +77,6 @@ function run_playbook() { fi } -function parse_playbook_dir_or_fail() { - local opt=$1 - local env=${HPA_PLAYBOOK_DIR} - - if [ ! "$opt" = "" ]; then - if [ -f "$opt" ]; then - debug_print "Parse Playbook:" "using option." - playbook_dir=$(dirname "$opt") - return 0 - elif [ -d "$opt" ]; then - debug_print "Parse Playbook:" "using option." - playbook_dir=$opt - return 0 - else - fail "Parse Playbook Dir: Playbook was not file or directory: $opt" - fi - fi - - ensure_playbook_dir_from_env_or_fail - playbook_dir="$env" -} - function parse_opt_or_env_var { local opt=$1 local env=$2 @@ -121,20 +88,35 @@ function parse_opt_or_env_var { fi } +function parse_playbook_dir_or_fail() { + local label="Parse Playbook:" + local parsed=$(parse_opt_or_env_var $1 ${HPA_PLAYBOOK_DIR}) + + [ "$parsed" = "" ] && fail "$label playbook directory not found." + + if [ -f "$parsed" ]; then + playbook_dir=$(dirname "$parsed") + elif [ -d "$parsed" ]; then + playbook_dir=$parsed + else + fail "$label playbook directory not found." + fi + +} + # NOTE: assumes playbook_dir has been set. function parse_inventory_or_fail() { - local label="Parse Inventory:" + local label="Parse Inventory:" debug_print $label "opt: '$1'" - local output=$(parse_opt_or_env_var $1 ${HPA_DEFAULT_INVENTORY}) + local parsed=$(parse_opt_or_env_var $1 ${HPA_DEFAULT_INVENTORY}) + debug_print $label "parsed opt or env: '$parsed'" - debug_print $label "parsed opt or env: '$output'" - - if [ ! "$output" = "" ]; then - [ ! -f "$output" ] && fail "$label inventory is not a file." + if [ ! "$parsed" = "" ]; then + [ ! -f "$parsed" ] && fail "$label inventory is not a file." debug_print $label "using parsed inventory." - inventory=$output + inventory=$parsed elif [ -f "$playbook_dir/inventory.ini" ]; then debug_print $label "using default playbook option." inventory="$playbook_dir/inventory.ini" @@ -167,9 +149,26 @@ function parse_repo_version_or_fail() { fail "$label failed to find template repo version." fi } + +function setup_command() { + local label=$1 + local verbose=$2 + local quietOpt=$3 + local playbookOpt=$4 + local inventoryOpt=$5 + + set_verbose $verbose + set_quiet $quietOpt + + parse_playbook_dir_or_fail "$playbookOpt" + parse_inventory_or_fail "$inventoryOpt" + debug_print "$label" "playbook dir: '$playbook_dir'" + debug_print "$label" "inventory: '$inventory'" +} + ########################## SUBCOMMANDS ######################### -function setup_project() { +function create_project() { function usage() { cat < [playbook-args...] + + Where: + project-dir : The path to the project to build. + playbook-args : Extra arguments passed after the project directory get passed directly to the ansible-playbook command. + + Options: + + -v | --vars-dir : Specifiy where project variables are loaded from, useful if they are not + in the root of the project directory. + + Global Options: + + -i | --inventory : A custom ansible inventory file to use (optional if calling this script from the playbook directory). + -p | --playbook : Path to the ansible-hpa-playbook (optional if calling this script from the playbook directory). + -q | --quiet : Surpress ansible output to only errors and warnings. + Global Flags: --verbose : Increase log output. @@ -217,88 +304,105 @@ function setup_project() { EOF } - - local label="Setup Project:" - zparseopts -D -E - \ p:=playbookOpt -playbook:=playbookOpt \ i:=inventoryOpt -inventory:=inventoryOpt \ - t:=template -template-dir:=template \ - r:=repo -repo:=repo \ - v:=version -version:=version \ - b:=version -branch:=version \ - h=help -help=help \ - l=localTemplateDir -local-template-dir=localTemplateDir \ + v:=varsDir -vars-dir:=varsDir \ -verbose=verbose \ q=quietOpt -quiet=quietOpt - # exit early and show help - [ ! "$help" = "" ] && usage && exit 0 + local label="Build Project:" + local build_args=("--tags" "build-project") - set_verbose $verbose - set_quiet $quietOpt + setup_command $label $verbose $quietOpt \ + ${playbookOpt[-1]} ${inventoryOpt[-1]} - debug_print "$label" "begin args: $@" + local project_dir=$1 + [ "$project_dir" = "" ] && fail "$label did not specify project directory" + shift + build_args+=("--extra-vars" "project_dir=$project_dir") - parse_playbook_dir_or_fail "${playbookOpt[-1]}" - parse_inventory_or_fail "${inventoryOpt[-1]}" - debug_print "$label" "playbook dir: $playbook_dir" - debug_print "$label" "inventory: $inventory" + debug_print $label "args: $build_args" - local project_dir="$1" - [ "$project_dir" = "" ] && fail "Setup Project: project directory not supplied" - shift; - - parse_template_dir "${template[-1]}" - local json= - - if [ ! "$localTemplateDir" = "" ]; then - debug_print $label "parsed template dir: '$template_dir'" - if [ "$template_dir" = "" ]; then - fail "$label failed to find template directory." - fi - json="{'template': {'path': '"$template_dir"'}}" - else - parse_repo_or_fail ${repo[-1]} - parse_repo_version_or_fail ${version[-1]} - debug_print $label "parsed repo: '$template_repo'" - debug_print $label "parsed repo version: '$template_repo_version'" - json="{'template': {'repo': {'url': '"$template_repo"', 'version': '"$template_repo_version"' }}}" + if [ ${#varsDir} -gt 1 ]; then + build_args+=("--extra-vars" "project_vars_dir=${varsDir[-1]}") fi - debug_print "$label" "json: $json" + run_playbook "${build_args[@]}" "$@" +} - run_playbook \ - --tags setup-project \ - --extra-vars "$json" \ - --extra-vars "project_dir=$project_dir" \ - "$@" +function create_project_template() { + zparseopts -D -E - \ + p:=playbookOpt -playbook:=playbookOpt \ + i:=inventoryOpt -inventory:=inventoryOpt \ + v:=varsDir -vars-dir:=varsDir + w:=vaultOpt -with-vault:=vaultOpt \ + -verbose=verbose \ + q=quietOpt -quiet=quietOpt + + local label="Create Project Template:" + local template_args=("--tags" "repo-template") + + setup_command $label $verbose $quietOpt \ + ${playbookOpt[-1]} ${inventoryOpt[-1]} + + local output_dir=$1 + [ "$output_dir" = "" ] && fail "$label did not specify output directory" + shift + template_args+=("--extra-vars" "output_dir=$output_dir") + + if [ ${#varsDir} -gt 1 ];then + template_args+=("--extra-vars" "repo_vars_dir=${varsDir[-1]}") + fi + + run_playbook "${template_args[@]}" "$@" } ########################## MAIN ######################### function main() { + function usage() { + cat <