feat: fixes not cloning repo when not using a local template directory when setting up a project.
This commit is contained in:
@@ -11,12 +11,19 @@
|
|||||||
tags:
|
tags:
|
||||||
- always
|
- always
|
||||||
|
|
||||||
|
- name: Debug template variable.
|
||||||
|
ansible.builtin.debug:
|
||||||
|
var: template
|
||||||
|
tags:
|
||||||
|
- debug
|
||||||
|
- never
|
||||||
|
|
||||||
- name: Ensure repo.
|
- name: Ensure repo.
|
||||||
ansible.builtin.git:
|
ansible.builtin.git:
|
||||||
repo: "{{ template.repo.url }}"
|
repo: "{{ template.repo.url }}"
|
||||||
dest: "{{ template_dir }}"
|
dest: "{{ template_dir }}"
|
||||||
version: "{{ template.repo.version | default('main') }}"
|
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:
|
tags:
|
||||||
- always
|
- always
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "Project dir: {{ project_dir }}"
|
msg: "Project dir: {{ project_dir }}"
|
||||||
tags:
|
tags:
|
||||||
- always
|
- setup-project
|
||||||
|
- never
|
||||||
|
|
||||||
- name: Debug template vars pre parse.
|
- name: Debug template vars pre parse.
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
|
|||||||
284
scripts/hpa
284
scripts/hpa
@@ -62,17 +62,6 @@ function load_config() {
|
|||||||
done
|
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.
|
# NOTE: Assumes playbook_dir and inventory have been setup.
|
||||||
function run_playbook() {
|
function run_playbook() {
|
||||||
if [ "$quiet" = "" ]; then
|
if [ "$quiet" = "" ]; then
|
||||||
@@ -88,28 +77,6 @@ function run_playbook() {
|
|||||||
fi
|
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 {
|
function parse_opt_or_env_var {
|
||||||
local opt=$1
|
local opt=$1
|
||||||
local env=$2
|
local env=$2
|
||||||
@@ -121,20 +88,35 @@ function parse_opt_or_env_var {
|
|||||||
fi
|
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.
|
# NOTE: assumes playbook_dir has been set.
|
||||||
function parse_inventory_or_fail() {
|
function parse_inventory_or_fail() {
|
||||||
local label="Parse Inventory:"
|
|
||||||
|
|
||||||
|
local label="Parse Inventory:"
|
||||||
debug_print $label "opt: '$1'"
|
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 [ ! "$parsed" = "" ]; then
|
||||||
|
[ ! -f "$parsed" ] && fail "$label inventory is not a file."
|
||||||
if [ ! "$output" = "" ]; then
|
|
||||||
[ ! -f "$output" ] && fail "$label inventory is not a file."
|
|
||||||
debug_print $label "using parsed inventory."
|
debug_print $label "using parsed inventory."
|
||||||
inventory=$output
|
inventory=$parsed
|
||||||
elif [ -f "$playbook_dir/inventory.ini" ]; then
|
elif [ -f "$playbook_dir/inventory.ini" ]; then
|
||||||
debug_print $label "using default playbook option."
|
debug_print $label "using default playbook option."
|
||||||
inventory="$playbook_dir/inventory.ini"
|
inventory="$playbook_dir/inventory.ini"
|
||||||
@@ -167,9 +149,26 @@ function parse_repo_version_or_fail() {
|
|||||||
fail "$label failed to find template repo version."
|
fail "$label failed to find template repo version."
|
||||||
fi
|
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 #########################
|
########################## SUBCOMMANDS #########################
|
||||||
|
|
||||||
function setup_project() {
|
function create_project() {
|
||||||
function usage() {
|
function usage() {
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
@@ -193,7 +192,6 @@ function setup_project() {
|
|||||||
-v | --version : The version of the repo to clone (ignored if the -t option is used).
|
-v | --version : The version of the repo to clone (ignored if the -t option is used).
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
-h | --help : Show this help page.
|
|
||||||
-l | --local-template-dir : Force using local template dir, generally used when config holds the information for where to
|
-l | --local-template-dir : Force using local template dir, generally used when config holds the information for where to
|
||||||
locate the template directory on the system.
|
locate the template directory on the system.
|
||||||
|
|
||||||
@@ -203,6 +201,95 @@ function setup_project() {
|
|||||||
-p | --playbook : Path to the ansible-hpa-playbook (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.
|
-q | --quiet : Surpress ansible output to only errors and warnings.
|
||||||
|
|
||||||
|
Global Flags:
|
||||||
|
-h | --help : Show this help page.
|
||||||
|
--verbose : Increase log output.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
# Setup a project for super-customer using a local template directory.
|
||||||
|
$ hpa setup-project --template ~/projects/my-template ~/consults/super-customer --ask-vault-pass
|
||||||
|
|
||||||
|
# Setup a project for super-customer using a template repo.
|
||||||
|
$ hpa setup-project --repo "https://git.example.com/my-template.git" --branch "main" ~/consults/super-customer --ask-vault-pass
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
local label="Setup Project:"
|
||||||
|
local setup_args=("--tags" "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 \
|
||||||
|
-verbose=verbose \
|
||||||
|
q=quietOpt -quiet=quietOpt
|
||||||
|
|
||||||
|
# exit early and show help
|
||||||
|
[ ! "$help" = "" ] && usage && exit 0
|
||||||
|
|
||||||
|
setup_command $label $verbose $quietOpt \
|
||||||
|
${playbookOpt[-1]} ${inventoryOpt[-1]}
|
||||||
|
|
||||||
|
local project_dir="$1"
|
||||||
|
[ "$project_dir" = "" ] && fail "Setup Project: project directory not supplied"
|
||||||
|
setup_args+=("--extra-vars" "project_dir=$project_dir")
|
||||||
|
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"' }}}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
debug_print "$label" "json: $json"
|
||||||
|
setup_args+=("--extra-vars" "$json")
|
||||||
|
|
||||||
|
run_playbook "${setup_args[@]}" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_project() {
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Build a project.
|
||||||
|
|
||||||
|
This script calls the ansible-hpa-playbook that builds project from the supplied directory.
|
||||||
|
|
||||||
|
Usage: hpa build-project [Options [GlobalOptions]] <project-dir> [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:
|
Global Flags:
|
||||||
--verbose : Increase log output.
|
--verbose : Increase log output.
|
||||||
|
|
||||||
@@ -217,88 +304,105 @@ function setup_project() {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
local label="Setup Project:"
|
|
||||||
|
|
||||||
zparseopts -D -E - \
|
zparseopts -D -E - \
|
||||||
p:=playbookOpt -playbook:=playbookOpt \
|
p:=playbookOpt -playbook:=playbookOpt \
|
||||||
i:=inventoryOpt -inventory:=inventoryOpt \
|
i:=inventoryOpt -inventory:=inventoryOpt \
|
||||||
t:=template -template-dir:=template \
|
v:=varsDir -vars-dir:=varsDir \
|
||||||
r:=repo -repo:=repo \
|
|
||||||
v:=version -version:=version \
|
|
||||||
b:=version -branch:=version \
|
|
||||||
h=help -help=help \
|
|
||||||
l=localTemplateDir -local-template-dir=localTemplateDir \
|
|
||||||
-verbose=verbose \
|
-verbose=verbose \
|
||||||
q=quietOpt -quiet=quietOpt
|
q=quietOpt -quiet=quietOpt
|
||||||
|
|
||||||
# exit early and show help
|
local label="Build Project:"
|
||||||
[ ! "$help" = "" ] && usage && exit 0
|
local build_args=("--tags" "build-project")
|
||||||
|
|
||||||
set_verbose $verbose
|
setup_command $label $verbose $quietOpt \
|
||||||
set_quiet $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]}"
|
debug_print $label "args: $build_args"
|
||||||
parse_inventory_or_fail "${inventoryOpt[-1]}"
|
|
||||||
debug_print "$label" "playbook dir: $playbook_dir"
|
|
||||||
debug_print "$label" "inventory: $inventory"
|
|
||||||
|
|
||||||
local project_dir="$1"
|
if [ ${#varsDir} -gt 1 ]; then
|
||||||
[ "$project_dir" = "" ] && fail "Setup Project: project directory not supplied"
|
build_args+=("--extra-vars" "project_vars_dir=${varsDir[-1]}")
|
||||||
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"' }}}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
debug_print "$label" "json: $json"
|
run_playbook "${build_args[@]}" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
run_playbook \
|
function create_project_template() {
|
||||||
--tags setup-project \
|
zparseopts -D -E - \
|
||||||
--extra-vars "$json" \
|
p:=playbookOpt -playbook:=playbookOpt \
|
||||||
--extra-vars "project_dir=$project_dir" \
|
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 #########################
|
########################## MAIN #########################
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
FIX ME!.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
local label="MAIN:"
|
||||||
|
|
||||||
zparseopts -D -E - \
|
zparseopts -D -E - \
|
||||||
|
h=help -help=help \
|
||||||
p:=playbookOpt -playbook:=playbookOpt \
|
p:=playbookOpt -playbook:=playbookOpt \
|
||||||
i:=inventoryOpt -inventory:=inventoryOpt \
|
i:=inventoryOpt -inventory:=inventoryOpt \
|
||||||
-verbose=verbose \
|
-verbose=verbose \
|
||||||
q=quietOpt -quiet=quietOpt
|
q=quietOpt -quiet=quietOpt
|
||||||
|
|
||||||
|
|
||||||
set_verbose $verbose
|
set_verbose $verbose
|
||||||
set_quiet $quietOpt
|
set_quiet $quietOpt
|
||||||
|
|
||||||
debug_print "MAIN:" "Begin main: $@"
|
debug_print $label "Begin args: $@"
|
||||||
load_config
|
load_config
|
||||||
debug_print "MAIN:" "Loaded configuration."
|
debug_print $label "Loaded configuration."
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
setup-project)
|
create-project)
|
||||||
shift
|
shift
|
||||||
setup_project $playbookOpt $inventoryOpt $verbose $quietOpt $@
|
create_project $playbookOpt $inventoryOpt $verbose $quietOpt $help $@
|
||||||
|
;;
|
||||||
|
build-project)
|
||||||
|
shift
|
||||||
|
build_project $playbookOpt $inventoryOpt $verbose $quietOpt $help $@
|
||||||
|
;;
|
||||||
|
create-project-template)
|
||||||
|
shift
|
||||||
|
create_project_template $playbookOpt $inventoryOpt $verbose $quietOpt $help $@
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
fail "Fix me!"
|
[ ! "$help" = "" ] && usage && exit 0
|
||||||
|
# TODO: Show usage here.
|
||||||
|
fail "$label unrecognized option."
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user