Manuelle Operationen führen zu menschlichen Fehlern. Das häufige Hinzufügen und Entfernen von Cronjobs kann sehr zeitaufwändig sein. In diesem Artikel erstellen wir Shell-Skripte, die das Hinzufügen und Löschen von Cronjobs von Ubuntu EC2-Instances auf AWS automatisieren. Um diese Vorgänge auszuführen, benötigen Sie Zugriff auf die EC2-Instance. Der Benutzer, den Sie verwenden, muss über sudo-Zugriff verfügen, damit der Benutzer zu root wechseln und Cronjobs hinzufügen und löschen kann.
Fangen wir an.
Voraussetzungen
- Grundlegendes Verständnis von Shell-Skripten und Cronjobs.
- AWS-Konto (erstellen wenn Sie noch keins haben).
- EC2-Instanz mit dem Benutzer mit sudo-Zugriff (Klicken Sie hier, um zu erfahren, wie Sie eine EC2-Instanz erstellen, wenn Sie keine haben oder wenn Sie lernen möchten)
Was werden wir tun
- Erstellen Sie ein Shell-Skript, um Cronjobs hinzuzufügen.
- Führen Sie das Shell-Skript aus, um einen Cronjob hinzuzufügen.
- Erstellen Sie ein Shell-Skript, um Cronjobs zu entfernen.
- Führen Sie das Shell-Skript aus, um den Cronjob zu entfernen.
Erstellen Sie ein Shell-Skript, um Cronjobs hinzuzufügen
Erstellen Sie eine Datei auf Ihrem lokalen Linux-System und fügen Sie den folgenden Code hinzu. Sie finden den Code auch in meinem Github-Repo unter folgendem Link.
Github Link: https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-add-remove-cron-job/add-cronjob.sh
File: add-cronjob.sh
#!/bin/bash
helpFunction()
{
echo ""
printf "\033[1;32mUsage: $0 -K <internal.pem> -U <internal-user> -I <internal-ip> -a <cron-to-be-added>"
echo ""
echo -e "\t-K \".pem key of the server on which a cron job has to be added\""
echo -e "\t-U UserName of the server on which a cron job has to be added"
echo -e "\t-I IP of the server on which a cron job has to be added"
echo -e "\t-a Name of the cron to be added (in double quotes)"
echo "Add a new Cron Job"
echo "e.g."
echo "./add-cronjob.sh -K /Users/cloudcover/Documents/Rahul/access/rahuls.pem -U ubuntu -I ec2-35-180-234-158.eu-west-3.compute.amazonaws.com -a \"0 5 * * 1 testCronJob\""
echo -e "\033[0m" #reset color
exit 1 # Exit script after printing help
}
while getopts "I:K:U:a:" opt
do
case "$opt" in
K ) internalServerPemKey="$OPTARG" ;;
U ) internalServerUser="$OPTARG" ;;
I ) internalServerIP="$OPTARG" ;;
a ) addCron="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
echo "******************"
#echo $listCronJobs
# Print helpFunction in case parameters are empty
if [ -z "$internalServerIP" ] || [ -z "$internalServerPemKey" ] || [ -z "$internalServerUser" ] || [ -z "$addCron" ]
then
printf "\033[1;31m"
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
printf "\033[1;33m------------------------------------------------------------------Before ssh"
echo -e "\033[0m" #reset color
echo ".pem key of the server on which a new user has be created : $internalServerPemKey"
echo "UserName of the server on which a new user has be created : $internalServerUser"
echo "IP of the server on which a new user has be created : $internalServerIP"
echo "Name of the cron to be added : $addCron"
printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
printf "\033[1;33m------------------------------------------------------------------After ssh"
echo -e "\033[0m" #reset color
#echo "Executing connect_prod_cron_new.sh"
#sh connect_prod_cron_new.sh
#sleep 2
echo "after ssh"
echo "IP Of the Server:"
hostname -I
echo "Hostname of the Server:"
hostname
echo "Changing user to root"
sudo su <><> EOF
echo "User Switched To;"
whoami
printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Addition"
echo -e "\033[0m" #reset color
crontab -l | cat -n
if [ -n "$addCron" ]
then
echo "Inside addCron"
crontab -l >crontab.tmp
printf '%s\n' "$addCron" >>crontab.tmp
crontab crontab.tmp && rm -f crontab.tmp
fi
printf "\033[1;33m------------------------------------------------------------------Updated List of Cron Jobs"
echo -e "\033[0m" #reset color
crontab -l | cat -n
printf "\033[1;31mExiting from ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
#echo "Existing user ---> $userName"
EOF
HERE Bevor Sie einen neuen Cronjob erstellen, überprüfen Sie, ob die EC2-Instance über vorhandene Cronjobs verfügt
Melden Sie sich bei der EC2-Instanz an und prüfen Sie vorhandene Cronjobs
ssh -i ~/Downloads/howtoforge-test.pem [email protected]
Cronjobs auflisten
crontab -l
Führen Sie das Shell-Skript aus, um einen Cronjob hinzuzufügen
Wechseln Sie zu Ihrem lokalen Linux-Computer und fügen Sie mit dem folgenden Befehl einen Cronjob auf einer Ubuntu 18.04 EC2-Instanz hinzu. Dadurch wird ein Cronjob erstellt, der jede Minute ausgelöst wird und das aktuelle Datum in eine Datei schreibt. Sie können den Cronjob nach Ihren Anforderungen ändern.
./add-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -a "* * * * * /bin/date >> /tmp/cron_output"

Jetzt können Sie auch zur EC2-Instanz gehen, um zu prüfen, ob der Cronjob hinzugefügt wurde oder nicht.
ssh -i ~/Downloads/howtoforge-test.pem [email protected]
sudo -i
crontab -l
cat /tmp/cron_output
Im folgenden Screenshot sehen Sie, dass der Cronjob jede Minute hinzugefügt und ausgeführt wurde.

Erstellen Sie ein Shell-Skript, um Cronjobs zu entfernen
Wenn Sie jetzt glauben, dass Sie den hinzugefügten Cronjob entfernen müssen, können Sie dies ganz einfach mit dem Shell-Skript tun, das auf meinem Github verfügbar ist.
Erstellen Sie mit dem folgenden Code eine neue Datei auf Ihrem lokalen System.
Github Link: https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-add-remove-cron-job/remove-cronjob.sh
File: remove-cronjob.sh
#!/bin/bash
helpFunction()
{
echo ""
printf "\033[1;32mUsage: $0 -K <internal.pem> -U <internal-user> -I <internal-ip> -l <yes/no>"
echo ""
echo -e "\t-K \".pem key of the server on which a cron job has to be removed\""
echo -e "\t-U UserName of the server on which a cron job has to be removed"
echo -e "\t-I IP of the server on which a cron job has to be removed"
echo -e "\t-l List the existing Cron Jobs, provide \"yes\" as a parameter. Get a list first and then specify job no which needs to be removed"
echo -e "e.g."
echo "Remove a new Cron Job"
echo "./remove-cronjob.sh -K /Users/cloudcover/Documents/Rahul/access/rahuls.pem -U ubuntu -I ec2-52-47-90-247.eu-west-3.compute.amazonaws.com -l yes"
echo -e "\033[0m" #reset color
exit 1 # Exit script after printing help
}
while getopts "I:K:U:l:" opt
do
case "$opt" in
K ) internalServerPemKey="$OPTARG" ;;
U ) internalServerUser="$OPTARG" ;;
I ) internalServerIP="$OPTARG" ;;
l ) showListOfJobs="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
echo "******************"
echo $listCronJobs
# Print helpFunction in case parameters are empty
if [ -z "$internalServerIP" ] || [ -z "$internalServerPemKey" ] || [ -z "$internalServerUser" ] || [ -z "$showListOfJobs" ]
then
printf "\033[1;31m"
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
printf "\033[1;33m------------------------------------------------------------------Before ssh"
echo -e "\033[0m" #reset color
echo ".pem key of the server on which a new user has be created : $internalServerPemKey"
echo "UserName of the server on which a new user has be created : $internalServerUser"
echo "IP of the server on which a new user has be created : $internalServerIP"
if [ $showListOfJobs == "yes" ]
then
printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
printf "\033[1;33m------------------------------------------------------------------After ssh"
echo -e "\033[0m" #reset color
echo "after ssh"
hostname -I
hostname
echo "Changing user to root"
sudo su << EOF
echo "User Switched To;"
whoami
printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Deletion"
echo -e "\033[0m" #reset color
crontab -l | cat -n
printf "\033[1;31mExiting from ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
EOF
HERE
fi
echo "Enter Cron Job Line Number to be removed"
read lineNumber
printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
printf "\033[1;33m------------------------------------------------------------------After ssh"
echo -e "\033[0m" #reset color
echo "after ssh"
hostname -I
hostname
#sleep 2
echo "Changing user to root"
sudo su << EOF
echo "User Switched To;"
whoami
printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Deletion"
echo -e "\033[0m" #reset color
crontab -l | cat -n
crontab -l | sed -e "$lineNumber"d >crontab.tmp
crontab crontab.tmp && rm -f crontab.tmp
printf "\033[1;33m------------------------------------------------------------------Updated List of Cron Jobs"
echo -e "\033[0m" #reset color
crontab -l | cat -n
printf "\033[1;31mExiting from ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
EOF
HERE
Führen Sie das Shell-Skript aus, um den Cronjob zu entfernen
Um die Cronjobs zu entfernen, führen Sie das Shell-Skript aus. Es listet alle Cronjobs auf, die auf Ihrer Ubuntu 18.04 EC2-Instanz verfügbar sind. Sie können dann den zu löschenden Job auswählen, das Skript erledigt die Löschung für Sie.
./remove-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -l yes

Jetzt können Sie dasselbe Skript erneut ausführen, um den Cronjob in der EC2-Instanz aufzulisten.
./remove-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -l yes

Sie können den Cronjob auch von der EC2-Instanz selbst überprüfen.
ssh -i ~/Downloads/howtoforge-test.pem [email protected]
sudo -i
crontab -l

Schlussfolgerung
In diesem Artikel haben wir Shell-Skripte zum Hinzufügen und Entfernen von Cronjobs von Ubuntu EC2-Instanzen gesehen. Dies wird dazu beitragen, die manuelle Aufgabe des Hinzufügens oder Entfernens von Cronjobs zu automatisieren und potenzielle menschliche Fehler zu vermeiden, die aufgrund manueller Vorgänge auftreten können.