piku/piku-bootstrap

151 wiersze
4.6 KiB
Bash
Executable File

#!/bin/sh
# Usage:
# To bootstrap your machine called mybox.com with piku
#
# ./piku-bootstrap mybox.com
PBD=${PIKU_BOOTSTRAP_DIR:-~/.piku-bootstrap}
VENV="${PBD}/virtualenv"
REPO="${PBD}/piku"
VIRTUALENV_VERSION="16.0.0"
LOG="${PBD}/install.log"
main() {
# print a message if this is a first time run
if [ ! -d "${PBD}" ]; then
echo "Looks like this is your first time running piku-bootstrap."
echo "This script will self-install dependencies into ${PBD} now."
echo "Hit enter to continue or ctrl-C to abort."
read discarded
echo
fi
# ensure we have a dir
mkdir -p "${PBD}"
# ensure we have a virtualenv setup
if [ ! -d "$VENV" ]; then
echo " #> Virtualenv setup not found. Installing it into ${PBD}."
ensure_virtualenv
fi
# get into virtualenv
. "$VENV/bin/activate"
# ensure we have the piku repo checked out
if [ ! -d "${REPO}" ]; then
echo " #> Piku repo not found. Installing it into ${REPO}."
git clone https://github.com/piku/piku "${REPO}"
fi
# ensure ansible
if [ "`command -v ansible-playbook`" = "" ]
then
echo " #> ansible-playbook binary not found. Installing it into ${PBD}."
pip install -q "ansible==2.7.10" >"${LOG}" 2>&1
fi
if [ "$1" = "" ]
then
echo
echo "Usage:"
echo " `basename $0` [USER@]HOST [PLAYBOOK] [ANSIBLE_ARGS...]"
echo " `basename $0` list-playbooks"
echo " `basename $0` update"
echo
echo " HOST Creates a user 'piku' on the machine 'HOST',"
echo " installs git, and sets up the piku.py script"
echo " by default, unless PLAYBOOK is specified."
echo
echo " USER Optional non-root user to log in as (e.g. 'pi')."
echo
echo " PLAYBOOK Optional playbook to deploy on to the server."
echo " For example 'nodeenv.yml' installs nodeenv."
echo " Can be an absolute path to your own playbook."
echo
echo " list-playbooks"
echo " List available built-in playbooks."
echo
echo " update Pull the piku repo to get the latest playbooks."
echo
echo "Notes:"
echo
echo " * This script requires that you have root/sudo on HOST."
echo " * Use \`ssh-copy-id USER@HOST\` to upload your SSH key first."
echo " * HOST must be a Debian/Ubuntu based distribution."
echo
echo "Raspberry Pi example:"
echo
echo "\t`basename $0` pi@raspberrypi.local"
echo
echo " ** WARNING **"
echo " This script installs software and makes changes on the target"
echo " server. Only use a freshly provisioned server which you do not"
echo " mind being modified and reconfigured."
echo
else
case "$1" in
update)
echo "Updating piku repo."
cd "${REPO}"
git pull
;;
list-playbooks)
ls "${REPO}/playbooks"
;;
*)
host="$1"; shift
if [ ! "$1" = "" -a -z "${1##*.yml*}" ];
then
playbook="$1"; shift;
else
playbook="piku.yml"
fi
if [ -z "${playbook##*.yml*}" ]; then
echo "Bootstrapping piku onto ${host}"
builtin="${REPO}/playbooks/${playbook}"
if [ ! -f "${playbook}" -a -f "${builtin}" ]; then
echo "Using built-in playbook: ${playbook}"
playbook="${builtin}"
fi
PYTHONWARNINGS="ignore" ansible-playbook -i "${host}", "${playbook}" "$@"
else
echo "${playbook} is not a valid playbook name."
fi
;;
esac
fi
}
bail_install() {
echo " #> Self-installation failed."
echo " #> Check ${LOG} for details."
exit 1;
}
ensure_virtualenv() {
# TODO: use local virtualenv instead if `command -v virtualenv` succeeds
[ -d "${PBD}/virtualenv" ] || (\
cd "${PBD}"
[ -f "./.virtualenv-source/virtualenv.py" ] || install_virtualenv;
echo " #> Setting up the virtual environment." && \
./.virtualenv-source/virtualenv.py -q "${PBD}/virtualenv" || bail_install)
rm -rf ./.virtualenv-source
}
install_virtualenv() {
VIRTUALENV_URL="https://pypi.io/packages/source/v/virtualenv/virtualenv-${VIRTUALENV_VERSION}.tar.gz"
echo " #> Downloading & installing Virtualenv."
rm -rf "./.virtualenv-source"
mkdir -p "./.virtualenv-source"
[ -f "./virtualenv.tar.gz" ] || curl -s -f -L -o "./virtualenv.tar.gz" "${VIRTUALENV_URL}" || bail_install
tar -zxf "./virtualenv.tar.gz" -C "./.virtualenv-source/" --strip-components=1 && \
[ -d "./.virtualenv-source" ] && (\
cd "./.virtualenv-source" && \
/usr/bin/env python setup.py build > ${LOG} 2>&1 ) \
|| bail_install;
}
main "$@"