Making a Deployment Script Part I
Introduction
Recently I had to setup a deployment system from scratch. In the world of road side units and other DOT roadside devices firmware updates and patch deployments can be rough. Security is usually taken very seriously and getting access to the network segment for the devices you care for can be difficult to outright impossible.
To make matters more difficult for the maintainer many times there is no mass package deployment in place. Such was the case I ran into.
Disclaimer
I’m a strong proponent of testing before implementation. Therefore, I do not take any responsibility for your use of this information on your systems and the consequences that will ensue (good or bad). Remember the golden rules of IT:
1) Have a backup plan
2) Have a data backup
Follow these rules, and you will successfully recover most of the time.
Tools
This script specifically targets road side units however you can utilize these same principles for a variety of other projects.
- Shell, as I work out of the terminal 98% of the time I use native commands in shell, preferably BASH when I can. This is not the best way (python would be better here actually).
- Windows Subsystem Linux (you do not have to use this but I did and my scripts reflect this). I used Debian but there are other flavors that will work as well. Alpine, Busybox, etc will not be ideal choices for this exercise.
- Install Python3
- Install PSSH (uses python3), PSCP, etc
- Install Curl, WGET, gzip
Beginning the Script
I always start my scripts with variables
#!/bin/bash
#########################################
# Script Name: Deployment System
# Date: 1/3/2021
# Author: Robert Mathis
#########################################
#########################################
# Variables
#########################################
version='1.2.3'
container_image='https://microsoft_one_drive&download=1'
answer=1;
If you’ve not worked with scripting before, don’t fear, variables are fun! You can stick useful bits into them, often things that repeat throughout your script that would be a pain to change by hand. Of course there are other uses for variables but for now just think of them as boxes or containers.
Case Logic
Next we go right for the jugular with some basic questions. To do this we’re going to create some functions.
#########################################
# Functions
#########################################
locationsetup() {
while true; do
clear
echo "Upgrade System for Somewhere"
echo "This upgrade provided by Something"
echo "########################################"
echo ""
echo "Location Selection"
echo "########################################"
echo "1 Flagstaff"
echo "2 Rochester"
echo "3 Salem"
echo "########################################"
read -p "Where are we upgrading? Enter a number: " location
echo ""
read -r -p "Is location $location correct?? [y/n]" answer
case "$answer" in
[Yy][Ee][Ss]|[Yy]) # Yes or Y (case-insensitive).
return 0
;;
*) # Anything else (including a blank) is invalid.
;;
esac
done
}
deploymentsetup() {
while true; do
clear
echo ""
echo "Deployment Type"
echo "########################################"
echo "1 Connect:ITS Something"
if [[ $location -eq 2 ]];
then
echo "2 CVCP Something"
echo "3 VCCU Something"
fi
echo "########################################"
read -p "Enter the number of the deployment you would like to complete: " deployType
echo ""
read -r -p "Is deployment type $deployType correct? [y/n]" answer
case "$answer" in
[Yy][Ee][Ss]|[Yy]) # Yes or Y (case-insensitive).
return 0
;;
*) # Anything else (including a blank) is invalid.
;;
esac
done
}
The first thing you might notice is that we start with a function. Something like this:
function () {}
We can put arguments in the function if we want but what we’re after is some simple answers to some questions. The idea being to automate this process as much as possible.
We use a “while” loop to kick off both of our functions. The while loop has one purpose. It’s to ensure that if an answer is not typed in correctly the user of the script can retype their new answer in before proceeding. To make the while loop work we set a variable at the beginning called “answer”. If “yes” is not specified a 1 is returned. The loop will start over again until a 0 is returned which would be a successful function exit.
One thing to remember is that when checking against integers as opposed to strings (numbers verses words) double brackets need to be used for if statements. Also the “-eq” operator as opposed to the “==” operator needs to be used. The rest is fairly self explanatory and fairly reusable. To call the function simply invoke it like so:
#########################################
#Execution
#########################################
locationsetup; deploymentsetup;
Because we did not have arguments for the function there is no need for anything further. But if we did have arguments they would look like the following:
snmp_array_walker() {
arr=("$@");
for x in "${arr[@]}";
do
echo "Working on OID $x";
snmpget -v 2c -c public $ip $x;
echo " ";
sleep 1;
done;
}
In this script the function is expecting an array to be passed to it. In the world of shell you pass the argument in the following way:
snmp_array_walker "${array1[@]}"
You may not realize this but many times in Alpine or older Debian (9 and prior) versions calling something like the following:
service mysql status
Is the equivalent to calling a function with an argument. In fact if you were to go about it this way it would look far more familiar perhaps:
/etc/init.d/mysql status
In this case we’ve simply passed one of the function arguments to the service.
Going back to the earlier example with the function and the array. What happened here was we called the function and then passed one of the arrays to it. The argument is placed beside the function. There can be as many arguments as needed. In this case this is a special way to pass an array to the function. Basically I’ve requested the array1 variable and have called every item of the array to be passed to the function.
Stay tuned for part two when we actually get to walk through some other useful functions and if statements.
Recent Comments