اذهب إلى المحتوى

تُعدّ أتمتة المهام المتكررة هدفًا ضمنيًا لكل مستخدم يتعلم أساسيات باش، فهي في الغالب الغاية الأساسية من كل سكربت نكتبه، وسنعرض في هذا المقال مجموعة سكربتات مفيدة يمكنك الاستناد عليها لتتعلم أتمتة أي مهمة تريدها على خوادم لينكس، سنستخدم هنا جميع المهارات التي تعلمناها خلال السلسلة بدايةً من المصفوفات والجمل الشرطية وكذلك الحلقات والمفاهيم الأخرى.

إنشاء سكربت باش لإدارة المستخدمين

تُعدّ عملية إنشاء مستخدم على خوادم متعددة مهمة تقليدية لأي مدير نظام، لكنها مع التكرار تصبح مملة وشاقة، سننشئ معًا سكربت باش يؤتمت هذه العملية ويُنشئ المستخدمين تلقائيًا.

سنُجهّز في البداية ملفًا نصيًّا يتضمن الأسماء hostnames أو عناوين IP للخوادم المطلوب إنشاء المستخدم عليها.

يبين الملف servers.txt التالي على سبيل المثال أسماء خمسة خوادم:

kabary@handbook:~$ cat servers.txt
server1
server2
server3
server4
server5

لقد استخدمنا أسماء الخوادم هنا بدلًا من عناوين IP الخاصة بها لأن هذه العناوين مخزنة لدينا في الملف "etc/hosts/" الذي يتضمن الاسم hostname وعنوان IP المقابل له، وتستطيع أيضًا استخدام ملف إعدادات SSH.

والآن لنفحص سكربت إنشاء المستخدمين adduser.sh التالي:

#!/bin/bash

servers=$(cat servers.txt)

echo -n "Enter the username: "
read name
echo -n "Enter the user id: "
read uid

for i in $servers; do
echo $i
ssh $i "sudo useradd -m -u $uid $name"
if [ $? -eq 0 ]; then
echo "User $name added on $i"
else
echo "Error on $i"
fi
done

عند تنفيذ السكربت سيطلب منا إدخال اسم المستخدم والمُعرِّف الخاص به، ثم سيتصل السكربت بكل خادم من الخوادم المحددة في الملف servers.txt السابق عبر اتصال SSH ويُنشئ عليه المستخدم الذي طلبناه.

ننصح بمطالعة المزيد عن تقنية SSH للاتصال بالخوادم البعيدة عبر مشاهدة الفيديو التالي:

لنلاحظ الآن طريقة عمل السكربت بعد التنفيذ:

img01-bash-script-adduser.png

بهذا نكون قد نجحنا في إنشاء مستخدم يدعى ansible على الخوادم الخمسة المطلوبة.

يوجد نقطتان مهمتان للغاية يتوجب علينا فهمها عند التعامل مع سكربت من هذا النوع:

  • ضرورة استخدم مفاتيح مرور pass phrases فارغة لجلسات ssh، أو استخدم الوكيل ssh-agent لتمرير هويتنا إلى الخادم البعيد حتى لا نضطر لإدخال كلمة المرور في أثناء عمل السكربت
  • الحرص على امتلاك حساب مستخدم فعال وعالي الصلاحيات يتمتع بأذونات الوصول إلى جميع الخوادم المطلوبة بدون متطلبات تتعلق بكلمة المرور

تخيل أنك تحتاج لتعرف مستخدمين جدد على مائة خادم مثلًا، فكم ستكون العملية طويلة وشاقة، هنا تكمن أهمية الأتمتة إذ توفر عليك ساعات من العمل المضني.

أتمتة عمليات النسخ الاحتياطي

النسخ الاحتياطي مهمة أساسية لا غنى عنها في كل منظومة، وكثيرًا ما نستخدم سكربتات باش لأتمتة المهام، يبين السكربت backup.sh التالي مثالًا عليها:

#!/bin/bash

backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)

echo "Starting backup of: ${backup_dirs[@]}"

for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done

sudo rm /tmp/*.gzecho "Backup is done."

لنشرح السكربت أعلاه: أنشأنا في البداية مصفوفة تدعى backup_dirs سنكتب فيها أسماء المجلدات التي نريد أخذ نسخ احتياطية عنها، ثم عرّفنا ثلاثة متغيرات:

  • dest_dir: لتحديد مجلد الوجهة الذي ستُحفظ فيه النسخ الاحتياطية
  • dest_server: لتعيين الخادم الهدف
  • backup_time: لتحديد تاريخ بدء عملية النسخ الاحتياطي

وبعدها أنشأنا حلقة for ستمر على المجلدات الموجودة في المصفوفة "backup_dirs" واحدًا واحدًا وتضغط كل مجلد منها باستخدام التعليمة tar وتحتفظ بالنسخة المضغوطة في المجلد المؤقت tmp/، ثم تنسخها إلى الخادم الهدف بواسطة التعليمة scp، وبعد اكتمال النسخ ستُحذف الملفات المضغوطة من المجلد tmp/.

يبين الخرج التالي أمثلة على طريقة عمل السكربت:

kabary@handbook:~$ ./backup.sh
Starting backup of: /etc /home /boot
/etc backup succeeded.
etc-Aug-30-20.tar.gz 100% 1288KB 460.1KB/s   00:02
/etc transfer succeeded.
/home backup succeeded.
home-Aug-30-20.tar.gz 100% 2543KB 547.0KB/s   00:04
/home transfer succeeded.
/boot backup succeeded.
boot-Aug-30-20.tar.gz 100%  105MB 520.2KB/s   03:26
/boot transfer succeeded.
Backup is done.

يمكننا جدولة السكربت باستخدام مهام cron job لتبدأ أعمال النسخ الاحتياطي عند منتصف الليل مثلًا، وذلك وفق التالي:

kabary@handbook:~$ crontab -e
0    0   *   *   * /home/kabary/scripts/backup.sh

يمكن معرفة المزيد عن جدولة المهام بواسطة cron بالاطلاع على الفيديو التالي على قناة أكاديمية حسوب:

مراقبة المساحات التخزينية المتوفرة على القرص الصلب

المساحات التخزينية على نظام الملفات في تناقص دائم وهذا أمرٌ مفروغٌ منه، وكل ما نستطيع القيام به تجاه هذا الأمر هو المراقبة والتصرف بالوقت المناسب حتى يؤدي التناقص المستمر إلى نفاذ المساحة وتعطل النظام، يساعدنا الأمر df على عرض المساحات المتوفرة على أي نظام ملفات، وهذا مثال على استخدامه:

kabary@handbook:~$ df -h / /apps /database
Filesystem Size  Used Avail Use% Mounted on
/dev/sda5 20G  7.9G   11G  44% /
/dev/mapper/vg1-applv 4.9G  2.4G  2.3G  52% /apps
/dev/mapper/vg1-dblv 4.9G  4.5G  180M  97% /database

كما نلاحظ هنا فالمساحة المخصصة لقاعدة البيانات database/ على نظام الملفات هذا تكاد تنفذ فنسبة استخدامها 97%، يمكنك عرض نسبة الاستخدام فقط بدون التفاصيل الأخرى بواسطة الأمر awk.

دعونا لنستعمل الآن هذين الأمرين في السكربت disk_space.sh كما يلي:

#!/bin/bash
filesystems=("/" "/apps" "/database")
for i in ${filesystems[@]}; do
usage=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $usage -ge 90 ]; then
alert="Running out of space on $i, Usage is: $usage%"
echo "Sending out a disk space alert email."
echo $alert | mail -s "$i is $usage% full" your_email
fi
done

يبدأ السكربت بإنشاء مصفوفة تدعى filesystems نكتب فيها أسماء مسارات أنظمة الملفات التي نود مراقبتها، ويوجد بعدها حلقة تكرار تُنَفذ عند كل عنصر من عناصر المصفوفة، وتستعلم عن نسبة استخدام المساحة التخزينية المخصصة له فإذا كانت أكبر من 90% سيُرسل لنا السكربت تنبيهًا عبر البريد الإلكتروني يخبرنا بأن المساحة على وشك النفاذ.

ملاحظة: لاستخدام السكربت السابق يتوجب استبدال your_email بعنوان بريد إلكتروني حقيقي.

سنحصل على هذا الخرج بعد تنفيذ السكربت:

kabary@handbook:~$ ./disk_space.sh
Sending out a disk space alert email.

وستكون رسالة البريد الإلكتروني مشابهة للتالي:

img02 send email bash sript

لنفترض الآن أننا نرغب بجدولة السكربت disk_space.sh ليعمل كل ست ساعات مرة باستخدام مهام cron، فسنكتب التالي:

kabary@handbook:~$ crontab -e
0    */6 *       *       * /home/kabary/scripts/disk_space.sh

الخاتمة

وصلنا لنهاية مقالنا الذي عرضنا لكم فيه أمثلة بسيطة توضح أتمتة المهام بواسطة سكربتات باش، إن الإمكانات الفعلية لباش أكبر بكثير، لذا ندعوكم لتجربة تطوير السكربتات الموجودة هنا وتنفيذ أفكار أخرى مختلفة لتقوية مهاراتكم في باش واكتساب القدرة على أتمتة أي عمل تحتاجه على خوادم لينكس، كانت هذه نصيحتنا في ختام سلسلتنا التعليمية عن باش، نذكرك أخيرًا برابط سلسلة تعلم البرمجة باستخدام باش    .

ترجمة -وبتصرف- للمقال Automation With Bash.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...