Managing Multiple OpenStack CLI Environments
If you’re an OpenStack administrator or power user, there’s a good chance
you need to use the OpenStack command-line tools within multiple projects.
Here’s a bash
script to help you move between projects.
I’ll say it here and then I’ll say it again in the script’s embedded
comments: you need to source the following script rather than
executing it. Otherwise, you’ll find yourself with an unchanged
environment. Assuming you name the script stackenv
, usage would
look something like this:
# use the source builtin
source stackenv
# or its alias
. stackenv
# use it to set environment for a project
. stackenv set
# or clear that environment
source stackenv clear
I’ll offer only one other comment on the script: it’s specific to
bash
. I haven’t tested it under other sh-compatible shells, but I
doubt it’s 100% functional.
#!/bin/bash
#
# for managing environments for multiple OpenStack projects
#
# this script should be sourced NOT executed since it wants to
# alter the current shell environment. likewise, the "exit" command
# should never appear in this script, lest your current shell
# disappear.
#
# =====================================================================
# space-separated list of your OpenStack projects: required!
PRJS="project-one projectTwo yet-another"
# some openstack info: required!
MY_AUTH_URL="http://openstack.domain.com:5000/v2.0"
MY_REGION_NAME="RegionOne"
# your default username (defaults to your system username)
MY_USERNAME=$(whoami)
# what $PS1 should be when this script resets the environment
MYPS1='[\u@\h \W]\\$ '
# name of this script
ME="stackenv"
# default action is to print the usage screen
VERB=${1:-help}
# placeholder for selection made later
MY_TENANT_NAME=""
# do basic check to see if script is being sourced. WARNING: this
# is a bash-specific test. it's pretty much guaranteed to fail for
# other shells
if test "$0" = "$BASH_SOURCE"; then
echo "FATAL: $ME should be sourced NOT executed" >&2
VERB="help"
fi
function listProjects {
echo ""
echo "available projects:"
for P in $PRJS; do
echo "- $P"
done
}
function printEnvironment {
# don't echo the password
echo "OS_USERNAME=$OS_USERNAME"
echo "OS_TENANT_NAME=$OS_TENANT_NAME"
echo "OS_PASSWORD=*********"
echo "OS_AUTH_URL=$OS_AUTH_URL"
echo "OS_REGION_NAME=$OS_REGION_NAME"
}
function setEnvironment {
if test -z "$MY_TENANT_NAME"; then return 1; fi
unset -v OS_SERVICE_TOKEN
# default OpenStack authentication and region variables
OS_AUTH_URL="$MY_AUTH_URL"
OS_REGION_NAME="$MY_REGION_NAME"
# set project name
OS_TENANT_NAME=$MY_TENANT_NAME
# set username
read -p "Username for project $MY_TENANT_NAME? [$MY_USERNAME] "
case "$REPLY" in
[A-Za-z]*)
OS_USERNAME=$REPLY
;;
*)
OS_USERNAME=$MY_USERNAME
;;
esac
# set password
read -s -p "Password for user $OS_USERNAME in project $MY_TENANT_NAME? "
OS_PASSWORD="$REPLY"
echo
return 0
}
function selectProject {
PS3="Select an OpenStack project: "
select MY_TENANT_NAME in $PRJS; do
if [ $MY_TENANT_NAME ]; then
return
else
echo "invalid choice. exiting now"
MY_TENANT_NAME=""
break
fi
done
}
function usage {
echo ""
echo "usage:"
echo ""
echo " . $ME help -- print this usage menu"
echo " . $ME report -- print current OpenStack env vars"
echo " . $ME list -- list available OpenStack projects"
echo " . $ME set -- set OpenStack env vars to work with a project"
echo " . $ME clear -- clear current OpenStack env vars"
echo ""
echo "NOTE: $ME can only alter your working enviroment when it is"
echo " sourced NOT run as a script."
echo ""
}
case "$VERB" in
clear)
export PS1="$MYPS1"
unset -v OS_SERVICE_TOKEN OS_USERNAME OS_PASSWORD
unset -v OS_AUTH_URL OS_TENANT_NAME OS_REGION_NAME
echo "OpenStack variables cleared from environment"
;;
help)
usage
;;
list)
listProjects
;;
set)
selectProject
setEnvironment
if test $? -eq 0; then
export PS1="${OS_TENANT_NAME}:${OS_USERNAME}> "
export OS_USERNAME OS_PASSWORD OS_AUTH_URL
export OS_TENANT_NAME OS_REGION_NAME
fi
;;
report)
printEnvironment
;;
*)
usage
;;
esac
# clean up variables and functions that don't belong in
# working environment
unset -f listProjects selectProject printEnvironment setEnvironment usage
unset -v ME MYPS1 MY_AUTH_URL MY_REGION_NAME
unset -v MY_TENANT_NAME MY_USERNAME PRJS REPLY VERB
# end