Last active
May 10, 2020 13:20
-
-
Save naumvd95/5689c80633eed82f384ed73cd2759991 to your computer and use it in GitHub Desktop.
Interactive bash dialog runner for AWS CFN stack management
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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