This repository has been archived on 2020-05-07. You can view files and clone it, but cannot push or open issues or pull requests.
dokku-ansible-deploy/functions

241 lines
7.5 KiB
Plaintext
Raw Permalink Normal View History

2020-04-07 14:10:31 +00:00
#!/usr/bin/env bash
2020-04-07 14:29:32 +00:00
2020-04-07 15:01:56 +00:00
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
# shellcheck disable=SC1090
2020-04-07 15:01:56 +00:00
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
2020-04-07 14:29:32 +00:00
dokku-ansible-deploy-validate-dependencies() {
# shellcheck disable=SC2034
2020-04-13 08:30:26 +00:00
declare desc="check that plugin dependencies are available"
declare ANSIBLE_DIR="$DOKKU_ROOT/.ansible/"
2020-04-07 14:29:32 +00:00
if ! command -v "ansible-playbook" &>/dev/null; then
dokku_col_log_info1_quiet "Missing ansible dependency, run dokku plugin:install-dependencies"
exit 1
fi
2020-04-13 08:30:26 +00:00
if [[ ! -d $ANSIBLE_DIR ]]; then
dokku_col_log_info1_quiet "Missing $ANSIBLE_DIR, run dokku plugin:install-dependencies"
exit 0
fi
2020-04-07 14:29:32 +00:00
}
2020-04-13 11:52:34 +00:00
dokku-ansible-deploy-deploy-d-create() {
# shellcheck disable=SC2034
declare desc="create a system level deploy.d directory"
if [[ ! -d "$DOKKU_LIB_ROOT/data/deploy.d" ]]; then
dokku_col_log_info1_quiet "Creating $DOKKU_LIB_ROOT/data/deploy.d"
2020-04-14 09:41:52 +00:00
mkdir -p "$DOKKU_LIB_ROOT/data/deploy.d"
2020-04-13 11:52:34 +00:00
fi
}
2020-04-07 14:29:32 +00:00
dokku-ansible-deploy-vault-pass-cmd() {
# shellcheck disable=SC2034
2020-04-07 14:52:18 +00:00
declare desc="add new app vault password for decryption of passwords"
2020-04-07 14:29:32 +00:00
2020-04-13 07:26:01 +00:00
declare APP="$2"
declare VAULT_FILE="$DOKKU_LIB_ROOT/data/deploy.d/$APP/.vault.sh"
2020-04-07 14:29:32 +00:00
2020-04-13 07:26:01 +00:00
if [[ ! -n "$APP" ]]; then
dokku_col_log_info1_quiet "missing app name, try 'dokku ansible-deploy:vault-pass myappname'"
2020-04-07 15:00:49 +00:00
exit 1
fi
if [[ -f $VAULT_FILE ]]; then
2020-04-13 07:26:01 +00:00
dokku_col_log_info1_quiet "Vault password already setup for $APP"
2020-04-07 14:29:32 +00:00
exit 0
fi
# shellcheck disable=SC2162 disable=SC2116 disable=SC2006
2020-04-13 11:53:19 +00:00
read -sp "Please enter your vault password for $APP: `echo $'\n> '`" VAULT_PASSWD; echo
2020-04-07 14:29:32 +00:00
2020-04-13 07:26:01 +00:00
if [[ ! -d "$DOKKU_LIB_ROOT/data/deploy.d/$APP" ]]; then
dokku_col_log_info1_quiet "Creating $DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-14 09:41:52 +00:00
mkdir -p "$DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-07 14:29:32 +00:00
fi
{ echo "#!/bin/bash";
echo "";
echo "set -eu -o pipefail";
echo "";
echo "echo \"$VAULT_PASSWD\""; } > "$VAULT_FILE"
2020-04-07 14:29:32 +00:00
chmod +x "$VAULT_FILE"
2020-04-07 14:29:32 +00:00
dokku_col_log_info1_quiet "Generated $VAULT_FILE for $APP"
}
dokku-ansible-deploy-sudo-pass-cmd() {
# shellcheck disable=SC2034
declare desc="add new dokku user sudo password for sudo escalation"
2020-04-13 11:52:34 +00:00
dokku-ansible-deploy-deploy-d-create
declare VARS_FILE="$DOKKU_LIB_ROOT/data/deploy.d/vars.yml"
# shellcheck disable=SC2162 disable=SC2116 disable=SC2006
2020-04-13 11:53:19 +00:00
read -sp "Please enter your Dokku system user sudo password: `echo $'\n> '`" SUDO_PASSWD; echo
{ echo "---";
echo "ansible_become_password: \"$SUDO_PASSWD\""; } > "$VARS_FILE"
dokku_col_log_info1_quiet "Generated $VARS_FILE"
2020-04-07 14:29:32 +00:00
}
dokku-ansible-deploy-dependencies() {
# shellcheck disable=SC2034
2020-04-07 14:29:32 +00:00
declare desc="install plugin dependencies"
2020-04-14 09:39:56 +00:00
declare DEPENDENCIES="ansible"
2020-04-13 11:16:49 +00:00
declare REQUIREMENTS="$PLUGIN_AVAILABLE_PATH/ansible-deploy/deps/requirements.yml"
2020-04-07 14:29:32 +00:00
2020-04-13 07:39:57 +00:00
dokku_col_log_info1_quiet "Ensuring the following packages are installed: $DEPENDENCIES"
export DEBIAN_FRONTEND=noninteractive
2020-04-13 11:16:49 +00:00
# shellcheck disable=SC2086
2020-04-13 11:14:48 +00:00
apt update && apt install -y $DEPENDENCIES
dokku_col_log_info1_quiet "Installing Ansible requirements"
ansible-galaxy install --role-file "$REQUIREMENTS" --force
dokku_col_log_info1_quiet "Copying Ansible library modules into place"
# shellcheck disable=SC2086
2020-04-14 09:41:52 +00:00
mkdir -p $DOKKU_ROOT/.ansible/{roles,plugins/modules}
2020-04-14 09:39:56 +00:00
# shellcheck disable=SC2086
2020-04-14 09:41:52 +00:00
cp -R $DOKKU_ROOT/.ansible/roles/*/library/* $DOKKU_ROOT/.ansible/plugins/modules
2020-04-07 14:29:32 +00:00
}
dokku-ansible-deploy-post-extract() {
# shellcheck disable=SC2034
2020-04-07 14:29:32 +00:00
declare desc="run the post-extract hook to setup the plugin"
2020-04-13 08:30:26 +00:00
dokku-ansible-deploy-validate-dependencies
2020-04-07 14:29:32 +00:00
declare APP="$1" TMPDIR="$2"
if [[ -d "$TMPDIR/deploy.d" ]] && [[ "$(ls -A "$TMPDIR/deploy.d")" ]]; then
2020-04-14 09:41:52 +00:00
mkdir -p "$DOKKU_LIB_ROOT/data/deploy.d/$APP"
cp -R "$TMPDIR/deploy.d/." "$DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-14 09:39:56 +00:00
dokku_col_log_info1_quiet "Copied deploy.d files and directories into place"
2020-04-07 14:29:32 +00:00
if [[ -d "$TMPDIR/deploy.d/vault" ]]; then
2020-04-13 12:07:37 +00:00
if [[ ! -f "$DOKKU_LIB_ROOT/data/deploy.d/$APP/.vault.sh" ]]; then
2020-04-13 07:40:07 +00:00
dokku_col_log_info1_quiet "Vault directory discovered but missing vault password"
2020-04-13 07:21:47 +00:00
dokku_col_log_info1_quiet "Please run dokku ansible-deploy:vault-password $APP"
2020-04-07 14:29:32 +00:00
exit 1
fi
fi
2020-04-13 12:19:51 +00:00
dokku_col_log_info1_quiet "Copying ansibile.cfg into place"
2020-04-14 09:41:52 +00:00
cp -R "$PLUGIN_AVAILABLE_PATH/ansible-deploy/ansible.cfg" /home/dokku/.ansible.cfg
2020-04-07 14:29:32 +00:00
fi
}
dokku-ansible-deploy-pre-deploy() {
# shellcheck disable=SC2034
declare desc="run the pre-deploy hook to setup an app"
2020-04-13 07:40:15 +00:00
2020-04-13 08:30:26 +00:00
dokku-ansible-deploy-validate-dependencies
2020-04-13 07:40:15 +00:00
declare APP="$1"
2020-04-13 09:42:33 +00:00
declare APP_DIR="$DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-13 12:23:56 +00:00
declare PLUGIN_DIR="$DOKKU_LIB_ROOT/data/deploy.d"
2020-04-13 12:07:37 +00:00
declare VAULT_FILE="$APP_DIR/.vault.sh"
2020-04-14 09:39:56 +00:00
declare PRE_DEPLOY="$PLUGIN_AVAILABLE_PATH/ansible-deploy/plays/predeploy/predeploy.yml"
2020-04-13 07:56:05 +00:00
dokku_col_log_info1_quiet "Running pre-deploy steps"
2020-04-13 07:40:15 +00:00
2020-04-13 09:42:33 +00:00
# shellcheck disable=SC2155
local CMD_ARGS="--inventory $(hostname), --connection local"
if [[ -f $VAULT_FILE ]]; then
dokku_col_log_info1_quiet "$APP vault password file $VAULT_FILE discovered"
CMD_ARGS="${CMD_ARGS} --vault-password-file $VAULT_FILE"
fi
dokku_col_log_info1_quiet "Running $PRE_DEPLOY"
2020-04-13 12:11:23 +00:00
# shellcheck disable=SC2086
2020-04-13 09:42:33 +00:00
ansible-playbook \
--extra-vars "app=$APP" \
--extra-vars "dokku_lib_root=$DOKKU_LIB_ROOT" \
--extra-vars "app_config_root=$APP_DIR" \
2020-04-13 12:23:56 +00:00
--extra-vars "plugin_config_root=$PLUGIN_DIR" \
2020-04-13 12:11:23 +00:00
$CMD_ARGS \
2020-04-13 12:12:46 +00:00
$PRE_DEPLOY
}
dokku-ansible-deploy-post-deploy() {
# shellcheck disable=SC2034
declare desc="run the post-deploy hook to finish an app setup"
2020-04-13 08:30:26 +00:00
dokku-ansible-deploy-validate-dependencies
declare APP="$1"
2020-04-13 09:42:33 +00:00
declare APP_DIR="$DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-13 12:23:56 +00:00
declare PLUGIN_DIR="$DOKKU_LIB_ROOT/data/deploy.d"
2020-04-13 12:07:37 +00:00
declare VAULT_FILE="$APP_DIR/.vault.sh"
2020-04-14 09:39:56 +00:00
declare POST_DEPLOY="$PLUGIN_AVAILABLE_PATH/ansible-deploy/plays/postdeploy/postdeploy.yml"
dokku_col_log_info1_quiet "Running post-deploy steps"
2020-04-13 09:42:33 +00:00
# shellcheck disable=SC2155
local CMD_ARGS="--inventory $(hostname), --connection local"
if [[ -f $VAULT_FILE ]]; then
dokku_col_log_info1_quiet "$APP vault password file $VAULT_FILE discovered"
CMD_ARGS="${CMD_ARGS} --vault-password-file $VAULT_FILE"
fi
dokku_col_log_info1_quiet "Running $POST_DEPLOY"
2020-04-13 12:11:23 +00:00
# shellcheck disable=SC2086
2020-04-13 09:42:33 +00:00
ansible-playbook \
--extra-vars "app=$APP" \
--extra-vars "dokku_lib_root=$DOKKU_LIB_ROOT" \
2020-04-13 12:11:23 +00:00
--extra-vars "app_config_root=$APP_DIR" \
2020-04-13 12:23:56 +00:00
--extra-vars "plugin_config_root=$PLUGIN_DIR" \
2020-04-13 12:11:23 +00:00
$CMD_ARGS \
2020-04-13 12:12:46 +00:00
$POST_DEPLOY
}
dokku-ansible-deploy-post-delete() {
# shellcheck disable=SC2034
declare desc="run the post-delete hook to remove an app"
2020-04-13 08:30:26 +00:00
dokku-ansible-deploy-validate-dependencies
declare APP="$1"
2020-04-13 09:42:33 +00:00
declare APP_DIR="$DOKKU_LIB_ROOT/data/deploy.d/$APP"
2020-04-13 12:23:56 +00:00
declare PLUGIN_DIR="$DOKKU_LIB_ROOT/data/deploy.d"
2020-04-13 12:07:37 +00:00
declare VAULT_FILE="$APP_DIR/.vault.sh"
2020-04-14 09:39:56 +00:00
declare POST_DELETE="$PLUGIN_AVAILABLE_PATH/ansible-deploy/plays/postdelete/postdelete.yml"
dokku_col_log_info1_quiet "Running post-delete steps"
2020-04-13 09:42:33 +00:00
# shellcheck disable=SC2155
local CMD_ARGS="--inventory $(hostname), --connection local"
if [[ -f $VAULT_FILE ]]; then
dokku_col_log_info1_quiet "$APP vault password file $VAULT_FILE discovered"
CMD_ARGS="${CMD_ARGS} --vault-password-file $VAULT_FILE"
fi
dokku_col_log_info1_quiet "Running $POST_DELETE"
2020-04-13 12:10:10 +00:00
# shellcheck disable=SC2086
2020-04-13 09:42:33 +00:00
ansible-playbook \
--extra-vars "app=$APP" \
--extra-vars "dokku_lib_root=$DOKKU_LIB_ROOT" \
--extra-vars "app_config_root=$APP_DIR" \
2020-04-13 12:23:56 +00:00
--extra-vars "plugin_config_root=$PLUGIN_DIR" \
2020-04-13 12:10:10 +00:00
$CMD_ARGS \
$POST_DELETE
}