Χρήση του Shell Scripting για την αυτοματοποίηση εργασιών συντήρησης συστήματος Linux - Μέρος 4


Πριν από λίγο καιρό διάβασα ότι ένα από τα διακριτικά χαρακτηριστικά ενός αποτελεσματικού διαχειριστή/μηχανικού συστήματος είναι η τεμπελιά. Στην αρχή φάνηκε λίγο αντιφατικό, αλλά ο συγγραφέας στη συνέχεια εξήγησε γιατί:

Εάν ένας sysadmin αφιερώνει τον περισσότερο χρόνο του στην επίλυση προβλημάτων και στην εκτέλεση επαναλαμβανόμενων εργασιών, μπορείτε να υποψιαστείτε ότι δεν κάνει τα πράγματα σωστά. Με άλλα λόγια, ένας αποτελεσματικός διαχειριστής/μηχανικός συστήματος θα πρέπει να αναπτύξει ένα σχέδιο για την εκτέλεση επαναλαμβανόμενων εργασιών με όσο το δυνατόν λιγότερη ενέργεια από την πλευρά του και θα πρέπει να προβλέπει προβλήματα χρησιμοποιώντας

για παράδειγμα, τα εργαλεία που εξετάζονται στο Μέρος 3 – Παρακολούθηση αναφορών δραστηριότητας συστήματος με χρήση συνόλων εργαλείων Linux αυτής της σειράς. Έτσι, παρόλο που μπορεί να μην φαίνεται να κάνει πολλά, αυτό οφείλεται στο γεγονός ότι οι περισσότερες από τις ευθύνες του/της έχουν ληφθεί μέριμνα με τη βοήθεια του shell scripting, για το οποίο θα μιλήσουμε σε αυτό το σεμινάριο.

Τι είναι ένα σενάριο κελύφους;

Με λίγα λόγια, ένα σενάριο φλοιού δεν είναι τίποτα περισσότερο και τίποτα λιγότερο από ένα πρόγραμμα που εκτελείται βήμα προς βήμα από ένα κέλυφος, το οποίο είναι ένα άλλο πρόγραμμα που παρέχει ένα επίπεδο διεπαφής μεταξύ του πυρήνα του Linux και του τελικού χρήστη.

Από προεπιλογή, το κέλυφος που χρησιμοποιείται για λογαριασμούς χρηστών στο RHEL 7 είναι το bash (/bin/bash). Εάν θέλετε μια λεπτομερή περιγραφή και κάποιο ιστορικό υπόβαθρο, μπορείτε να ανατρέξετε σε αυτό το άρθρο της Wikipedia.

Για να μάθετε περισσότερα σχετικά με το τεράστιο σύνολο δυνατοτήτων που παρέχει αυτό το κέλυφος, ίσως θελήσετε να ανατρέξετε στη man page του, η οποία έχει ληφθεί σε μορφή PDF στο (A Guide from Newbies to SysAdmin άρθρο στο linux-console.net πριν συνεχίσετε). Τώρα ας ξεκινήσουμε.

Σύνταξη σεναρίου για την εμφάνιση πληροφοριών συστήματος

Για τη διευκόλυνσή μας, ας δημιουργήσουμε έναν κατάλογο για να αποθηκεύουμε τα σενάρια φλοιού μας:

# mkdir scripts
# cd scripts

Και ανοίξτε ένα νέο αρχείο κειμένου με το όνομα system_info.sh με το πρόγραμμα επεξεργασίας κειμένου που προτιμάτε. Θα ξεκινήσουμε εισάγοντας μερικά σχόλια στην κορυφή και μερικές εντολές στη συνέχεια:

#!/bin/bash

# Sample script written for Part 4 of the RHCE series
# This script will return the following set of system information:
# -Hostname information:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
# -File system disk space usage:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
# -Free and used memory in the system:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
# -System uptime and load:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
# -Logged-in users:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
# -Top 5 processes as far as memory usage is concerned
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

Στη συνέχεια, δώστε στο σενάριο δικαιώματα εκτέλεσης:

# chmod +x system_info.sh

και τρέξε το:

./system_info.sh

Σημειώστε ότι οι κεφαλίδες κάθε ενότητας εμφανίζονται έγχρωμες για καλύτερη οπτικοποίηση:

Αυτή η λειτουργία παρέχεται από αυτήν την εντολή:

echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

Όπου COLOR1 και COLOR2 είναι τα χρώματα του προσκηνίου και του φόντου, αντίστοιχα (περισσότερες πληροφορίες και επιλογές επεξηγούνται σε αυτήν την καταχώρηση από το Arch Linux Wiki) και <ΤΟ ΚΕΙΜΕΝΟ ΣΑΣ ΕΔΩ είναι η συμβολοσειρά που θέλετε να εμφανίσετε με χρώμα.

Αυτοματοποίηση εργασιών

Οι εργασίες που μπορεί να χρειαστεί να αυτοματοποιήσετε μπορεί να διαφέρουν από περίπτωση σε περίπτωση. Έτσι, δεν μπορούμε να καλύψουμε όλα τα πιθανά σενάρια σε ένα μόνο άρθρο, αλλά θα παρουσιάσουμε τρεις κλασικές εργασίες που μπορούν να αυτοματοποιηθούν χρησιμοποιώντας δέσμες ενεργειών φλοιού:

1) ενημερώστε την τοπική βάση δεδομένων αρχείων, 2) βρείτε (και εναλλακτικά διαγράψτε) αρχεία με δικαιώματα 777 και 3) ειδοποίηση όταν η χρήση του συστήματος αρχείων υπερβαίνει ένα καθορισμένο όριο.

Ας δημιουργήσουμε ένα αρχείο με το όνομα auto_tasks.sh στον κατάλογο σεναρίων μας με το ακόλουθο περιεχόμενο:

#!/bin/bash

# Sample script to automate tasks:
# -Update local file database:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

# -Find and / or delete files with 777 permissions.
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
# Enable either option (comment out the other line), but not both.
# Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
# Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
# -Alert when file system usage surpasses a defined limit 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

Λάβετε υπόψη ότι υπάρχει ένα κενό μεταξύ των δύο πινακίδων < στην τελευταία γραμμή του σεναρίου.

Χρησιμοποιώντας το Cron

Για να πάτε την αποτελεσματικότητα ένα βήμα παραπέρα, δεν θα θέλετε να καθίσετε μπροστά στον υπολογιστή σας και να εκτελέσετε αυτά τα σενάρια χειροκίνητα. Αντίθετα, θα χρησιμοποιήσετε το cron για να προγραμματίσετε αυτές τις εργασίες να εκτελούνται σε περιοδική βάση και να στέλνετε τα αποτελέσματα σε μια προκαθορισμένη λίστα παραληπτών μέσω email ή να τα αποθηκεύσετε σε ένα αρχείο που μπορεί να προβληθεί χρησιμοποιώντας ένα πρόγραμμα περιήγησης ιστού.

Το ακόλουθο σενάριο (filesystem_usage.sh) θα εκτελέσει τη γνωστή εντολή df -h, θα μορφοποιήσει την έξοδο σε έναν πίνακα HTML και θα την αποθηκεύσει στο αρχείο report.html:

#!/bin/bash
# Sample script to demonstrate the creation of an HTML report using shell scripting
# Web directory
WEB_DIR=/var/www/html
# A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
# View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
# Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

Στον διακομιστή μας RHEL 7 (192.168.0.18), αυτό φαίνεται ως εξής:

Μπορείτε να προσθέσετε σε αυτήν την αναφορά όσες πληροφορίες θέλετε. Για να εκτελείτε το σενάριο κάθε μέρα στις 1:30 μ.μ., προσθέστε την ακόλουθη καταχώριση crontab:

30 13 * * * /root/scripts/filesystem_usage.sh

Περίληψη

Πιθανότατα θα σκεφτείτε πολλές άλλες εργασίες που θέλετε ή πρέπει να αυτοματοποιήσετε. Όπως μπορείτε να δείτε, η χρήση σεναρίων κελύφους θα απλοποιήσει σημαντικά αυτήν την προσπάθεια. Μη διστάσετε να μας ενημερώσετε εάν βρίσκετε αυτό το άρθρο χρήσιμο και μη διστάσετε να προσθέσετε τις δικές σας ιδέες ή σχόλια μέσω της παρακάτω φόρμας.