Skip to content

Commit

Permalink
Implemented CLI parameters for CoreOS script
Browse files Browse the repository at this point in the history
  • Loading branch information
kayrus committed Jul 7, 2016
1 parent 34556a1 commit 5aaf7cf
Showing 1 changed file with 136 additions and 30 deletions.
166 changes: 136 additions & 30 deletions deploy_coreos_cluster.sh
Original file line number Diff line number Diff line change
@@ -1,37 +1,101 @@
#!/bin/bash -e

usage() {
echo "Usage: $0 %cluster_size% [%pub_key_path%]"
echo "
Usage: $0 [options]
Options:
-c|--channel CHANNEL
channel name (stable/beta/alpha) [default: stable]
-r|--release RELEASE
CoreOS release [default: current]
-s|--size CLUSTER_SIZE
Amount of virtual machines in a cluster. [default: 1]
-p|--pub-key PUBLIC_KEY
Path to public key. Private key path will be
detected automatically. [default: ~/.ssh/id_rsa.pub]
-i|--config CLOUD_CONFIG
Path to cloud-config. [default: ./user_data]
-m|--ram RAM
Amount of memory in megabytes for each VM. [default: 512]
-u|--cpu CPUs
Amount of CPUs for each VM. [default: 1]
-v|--verbose Make verbose
-h|--help this help message
This script is a wrapper around libvirt for starting a cluster of CoreOS virtual
machines.
"
}

print_red() {
echo -e "\e[91m$1\e[0m"
}

print_green() {
echo -e "\e[92m$1\e[0m"
}

USER_ID=${SUDO_UID:-$(id -u)}
USER=$(getent passwd "${USER_ID}" | cut -d: -f1)
HOME=$(getent passwd "${USER_ID}" | cut -d: -f6)

while [ $# -ge 1 ]; do
case "$1" in
-c|--channel)
OPTVAL_CHANNEL="$2"
shift 2 ;;
-r|--release)
OPTVAL_RELEASE="$2"
shift 2 ;;
-s|--cluster-size)
OPTVAL_CLUSTER_SIZE="$2"
shift 2 ;;
-p|--pub-key)
OPTVAL_PUB_KEY="$2"
shift 2 ;;
-i|--config)
OPTVAL_CLOUD_CONFIG="$2"
shift 2 ;;
-m|--ram)
OPTVAL_RAM="$2"
shift 2 ;;
-u|--cpu)
OPTVAL_CPU="$2"
shift 2 ;;
-v|--verbose)
set -x
shift ;;
-h|-help|--help)
usage
exit ;;
*)
break ;;
esac
done

OS_NAME="coreos"

export LIBVIRT_DEFAULT_URI=qemu:///system
virsh nodeinfo > /dev/null 2>&1 || (echo "Failed to connect to the libvirt socket"; exit 1)
virsh list --all --name | grep -q "^${OS_NAME}1$" && (echo "'${OS_NAME}1' VM already exists"; exit 1)

USER_ID=${SUDO_UID:-$(id -u)}
USER=$(getent passwd "${USER_ID}" | cut -d: -f1)
HOME=$(getent passwd "${USER_ID}" | cut -d: -f6)

if [ "$1" == "" ]; then
echo "Cluster size is empty"
usage
exit 1
: ${CLUSTER_SIZE:=1}
if [ -n "$OPTVAL_CLUSTER_SIZE" ]; then
if ! [[ "$OPTVAL_CLUSTER_SIZE" =~ ^[0-9]+$ ]]; then
echo "'$OPTVAL_CLUSTER_SIZE' is not a number"
usage
exit 1
fi
CLUSTER_SIZE=$OPTVAL_CLUSTER_SIZE
fi

if ! [[ $1 =~ ^[0-9]+$ ]]; then
echo "'$1' is not a number"
usage
exit 1
: ${INIT_PUB_KEY:="$HOME/.ssh/id_rsa.pub"}
if [ -n "$OPTVAL_PUB_KEY" ]; then
INIT_PUB_KEY=$OPTVAL_PUB_KEY
fi

if [[ -z $2 || ! -f $2 ]]; then
echo "SSH public key path is not specified"
if [[ -z $INIT_PUB_KEY || ! -f $INIT_PUB_KEY ]]; then
print_red "SSH public key path is not valid or not specified"
if [ -n $HOME ]; then
PUB_KEY_PATH="$HOME/.ssh/id_rsa.pub"
else
Expand All @@ -45,32 +109,74 @@ if [[ -z $2 || ! -f $2 ]]; then
PRIV_KEY_PATH=$(echo ${PUB_KEY_PATH} | sed 's#.pub##')
if [ -f $PRIV_KEY_PATH ]; then
echo "Found private key, generating public key..."
sudo -u $USER ssh-keygen -y -f $PRIV_KEY_PATH | sudo -u $USER tee ${PUB_KEY_PATH} > /dev/null
if [ -n "$SUDO_UID" ]; then
sudo -u $USER ssh-keygen -y -f $PRIV_KEY_PATH | sudo -u $USER tee ${PUB_KEY_PATH} > /dev/null
else
ssh-keygen -y -f $PRIV_KEY_PATH > ${PUB_KEY_PATH}
fi
else
echo "Generating private and public keys..."
sudo -u $USER ssh-keygen -t rsa -N "" -f $PRIV_KEY_PATH
if [ -n "$SUDO_UID" ]; then
sudo -u $USER ssh-keygen -t rsa -N "" -f $PRIV_KEY_PATH
else
ssh-keygen -t rsa -N "" -f $PRIV_KEY_PATH
fi
fi
fi
else
PUB_KEY_PATH=$2
print_green "Will use this path to SSH public key: $PUB_KEY_PATH"
PUB_KEY_PATH=$INIT_PUB_KEY
print_green "Will use following path to SSH public key: $PUB_KEY_PATH"
fi

PUB_KEY=$(cat ${PUB_KEY_PATH})
PRIV_KEY_PATH=$(echo ${PUB_KEY_PATH} | sed 's#.pub##')
CDIR=$(cd `dirname $0` && pwd)
IMG_PATH=${HOME}/libvirt_images/${OS_NAME}
RANDOM_PASS=$(openssl rand -base64 12)
USER_DATA_TEMPLATE=${CDIR}/user_data
ETCD_DISCOVERY=$(curl -s "https://discovery.etcd.io/new?size=$1")
CHANNEL=alpha
#CHANNEL=beta
#CHANNEL=stable
RELEASE=current
#RELEASE=899.1.0
#RELEASE=681.2.0
RAM=512
CPUs=1

: ${USER_DATA_TEMPLATE:="${CDIR}/user_data"}
if [ -n "$OPTVAL_CLOUD_CONFIG" ]; then
if [ -f "$OPTVAL_CLOUD_CONFIG" ]; then
USER_DATA_TEMPLATE=$OPTVAL_CLOUD_CONFIG
else
print_red "Custom cloud-config specified, but it is not available"
print_red "Will use default cloud-config path (${USER_DATA_TEMPLATE})"
fi
fi

ETCD_DISCOVERY=$(curl -s "https://discovery.etcd.io/new?size=$CLUSTER_SIZE")

: ${CHANNEL:=stable}
if [ -n "$OPTVAL_CHANNEL" ]; then
CHANNEL=$OPTVAL_CHANNEL
fi

: ${RELEASE:=current}
if [ -n "$OPTVAL_RELEASE" ]; then
RELEASE=$OPTVAL_RELEASE
fi


: ${RAM:=512}
if [ -n "$OPTVAL_RAM" ]; then
if ! [[ "$OPTVAL_RAM" =~ ^[0-9]+$ ]]; then
echo "'$OPTVAL_RAM' is not a valid amount of RAM"
usage
exit 1
fi
RAM=$OPTVAL_RAM
fi

: ${CPUs:=1}
if [ -n "$OPTVAL_CPU" ]; then
if ! [[ "$OPTVAL_CPU" =~ ^[0-9]+$ ]]; then
echo "'$OPTVAL_CPU' is not a valid amount of CPUs"
usage
exit 1
fi
CPUs=$OPTVAL_CPU
fi

IMG_NAME="coreos_${CHANNEL}_${RELEASE}_qemu_image.img"
IMG_URL="https://${CHANNEL}.release.core-os.net/amd64-usr/${RELEASE}/coreos_production_qemu_image.img.bz2"
SIG_URL="https://${CHANNEL}.release.core-os.net/amd64-usr/${RELEASE}/coreos_production_qemu_image.img.bz2.sig"
Expand Down Expand Up @@ -112,7 +218,7 @@ if [ ! -f $USER_DATA_TEMPLATE ]; then
exit 1
fi

for SEQ in $(seq 1 $1); do
for SEQ in $(seq 1 $CLUSTER_SIZE); do
VM_HOSTNAME="${OS_NAME}${SEQ}"
if [ -z $FIRST_HOST ]; then
FIRST_HOST=$VM_HOSTNAME
Expand Down

0 comments on commit 5aaf7cf

Please sign in to comment.