Skip to content

Instantly share code, notes, and snippets.

@naumvd95
Last active May 10, 2020 13:20
Show Gist options
  • Save naumvd95/5689c80633eed82f384ed73cd2759991 to your computer and use it in GitHub Desktop.
Save naumvd95/5689c80633eed82f384ed73cd2759991 to your computer and use it in GitHub Desktop.
Interactive bash dialog runner for AWS CFN stack management
#!/bin/bash
set -x
# check packages
AWS_CLI_PATH="/usr/local/bin/aws"
DIALOG_CLI_PATH="/usr/local/bin/dialog"
if ! $DIALOG_CLI_PATH 2&>/dev/null; then
echo "dialog package package doesnot installed, please install it"
fi
if ! $AWS_CLI_PATH --version 2&>/dev/null; then
echo "aws cli package package doesnot installed, please install it and configure credentials"
fi
#global vars
CFN_TEMPLATE_URL="https://gist.githubusercontent.com/naumvd95/0c30a9b3039e429c344099144b51e065/raw/0521568f8273819abd077c8be68964b1e0b86a6a/aws-cfn-3-node-k8s-cluster.yaml"
CFN_TEMPLATE_FILEPATH="/tmp/vn-cfn-k8s-stack-boilerplate.yaml"
MENU_OUTPUT="/tmp/cfn-stack-menu-output-$(date +%m-%d-%Y).log"
# frequently managed
: "${CFN_STACK_NAME:=vn-k8s-stack-boilerplate}"
: "${AWS_KEYPAIR_NAME:=vn-k8s-keypair}"
: "${AWS_PROFILE:=}"
: "${AWS_PUBKEY_PATH:=vn-k8s-keypair.pub}"
# trap and delete temp files
trap 'echo "temp files will be deleted" && rm $CFN_TEMPLATE_FILEPATH; rm $MENU_OUTPUT; exit' SIGHUP SIGINT SIGTERM EXIT
function profile_checker {
if [ -z ${AWS_PROFILE} ]; then
echo please set AWS_PROFILE variable in script/ENV.
exit 1
fi
}
function display_menu {
local x_coord=15
local y_coord=45
local output=${1}
dialog --title "K8s cluster cfn boilerplate" --menu \
"Operate cloudformation template ops using arrows or numbers" \
$x_coord $y_coord 5 \
1 "Create aws ssh keypair" \
2 "Import existing ssh keypair" \
3 "Create stack" \
4 "Stack Status" \
5 "Wait for stack creation" \
6 "Get instances ip" \
7 "Delete stack" \
8 "Delete keypair from aws account" \
Q "Quit" 2>"$output"
}
function cfn_download {
if [ ! -f ${CFN_TEMPLATE_FILEPATH} ]; then
wget -q --show-progress ${CFN_TEMPLATE_URL} -O ${CFN_TEMPLATE_FILEPATH}
fi
}
function main {
while true; do
profile_checker
display_menu "$MENU_OUTPUT"
case $(<"${MENU_OUTPUT}") in
1) ssh-keygen -t rsa -C ${AWS_KEYPAIR_NAME} -f ${AWS_KEYPAIR_NAME}; \
aws ec2 import-key-pair --key-name ${AWS_KEYPAIR_NAME} \
--profile ${AWS_PROFILE} \
--public-key-material file://${AWS_PUBKEY_PATH} && \
echo "Keypair imported successfully, stored in ${AWS_PUBKEY_PATH}"; \
sleep 2;;
2) aws ec2 import-key-pair --key-name ${AWS_KEYPAIR_NAME} \
--profile ${AWS_PROFILE} \
--public-key-material file://${AWS_PUBKEY_PATH} && \
echo "Keypair imported successfully, stored in ${AWS_PUBKEY_PATH}"; \
sleep 2;;
3)
cfn_download
aws cloudformation create-stack \
--profile ${AWS_PROFILE} \
--template-body file://${CFN_TEMPLATE_FILEPATH} \
--stack-name ${CFN_STACK_NAME} \
--capabilities CAPABILITY_NAMED_IAM \
--parameters \
ParameterKey=KeyName,ParameterValue=${AWS_KEYPAIR_NAME};;
4) aws cloudformation describe-stack-events \
--profile ${AWS_PROFILE} \
--stack-name ${CFN_STACK_NAME} \
--max-items 4; \
sleep 2;;
5) aws cloudformation wait stack-create-complete \
--profile ${AWS_PROFILE} \
--stack-name ${CFN_STACK_NAME};;
6) aws cloudformation describe-stacks \
--profile ${AWS_PROFILE} \
--stack-name ${CFN_STACK_NAME} \
--query "Stacks[0].Outputs" \
--output text; \
sleep 5;;
7) aws cloudformation delete-stack \
--profile ${AWS_PROFILE} \
--stack-name ${CFN_STACK_NAME};;
8) aws ec2 delete-key-pair \
--profile ${AWS_PROFILE} \
--key-name ${AWS_KEYPAIR_NAME};;
Q) echo "Bye Bye"; \
rm "${CFN_TEMPLATE_FILEPATH} ${MENU_OUTPUT}" 2>/dev/null; \
exit 0;;
*) echo "Unknown command"; exit 1 ;;
esac
done
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment