برنامه نویسی

توسعه یک پلاگین ساده Sparrow با Raku و Bash

Sparrow در نوشتن اسکریپت برای خودکارسازی مدیریت سیستم با استفاده از Raku و Bash بسیار کارآمد است، در پست امروز قصد دارم یک مثال را نشان دهم …


استقرار فایل پیکربندی و راه اندازی مجدد سرویس پس از تغییرات

بیایید یک افزونه ساده ایجاد کنیم که برخی از پرچم‌های پیکربندی را در فایل پیکربندی سرویس فعال/غیرفعال می‌کند و در صورت بروز هرگونه تغییر، سرویسی را دوباره بارگیری می‌کنیم. فرمت پرچم ها در فایل پیکربندی به صورت زیر است:

var=true|false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا یک نمونه از فایل پیکربندی است:

config.txt

debug=true
sentry=false
tls=false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

معمولاً خدمات به عنوان واحدهای سیستمی مدیریت می شوند، بنابراین service reload می تواند برای بارگذاری مجدد پیکربندی سرویس استفاده شود.

#!bash

# create root directory for plugin source code
# for convenience 

mkdir -p service-config-reload
cd service-config-reload
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون در دایرکتوری ریشه افزونه:

hook.raku:

#!raku

my $cfg-orig = config()<path>.IO.slurp();

my $cfg = $cfg-orig;

for config()<enable><> -> $f {
   $cfg ~~ s/ "$f=" \S+ /$f=true/;
}

for config()<disable><> -> $f {
   $cfg ~~ s/ "$f=" \S+ /$f=false/;
}

set_stdout($cfg);

if $cfg ne $cfg-orig {
   set_stdout("config changed");
   config()<path>.IO.spurt($cfg);
   run_task "service_restart", %(
       service => config()<service>,
       path => config()<path>,
   );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

mkdir -p tasks/service_restart/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

tasks/service_restart/task.bash

#!bash

sudo service $service reload
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در برنامه‌های کاربردی واقعی، سرویس‌ها ممکن است دارای قابلیت Linter باشند که قبل از اعمال پیکربندی بررسی می‌شود و در صورت بروز هرگونه خطایی، برنامه تغییرات خاتمه می‌یابد:

#!bash

set -e
sudo /usr/bin/$service --check $path
sudo service $service reload
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سناریوی بسته بندی به عنوان یک افزونه به دیگران امکان استفاده از آن را می دهد.

sparrow.json

{
  "name" : "service-config-reload",
  "description" : "Deploy configuration file and restart service upon changes",
  "version" : "0.0.1",
  "category" : "linux",
  "url" : "https://github.com/melezhik/sparrow-plugins/tree/master/service-config-reload"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این آخرین دستور افزونه را در مخزن محلی Sparrow آپلود می کند (برای جزئیات بیشتر به این سند مراجعه کنید)

#!bash

s6 --upload
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده از افزونه ها

در هر نقطه از سناریوی Raku، فقط این کار را انجام دهید:

#!raku

use Sparrow6::DSL;

task-run "apply and reload", "service-config-reload", %(
   :path<config.txt>,
   :service<app>,
   enable => <tls sentry>, # enable TLS and use of Sentry for production
   disable => <debug>, # disable debug mode for production 
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


با تشکر برای خواندن!

کد منبع افزونه را می‌توانید در اینجا پیدا کنید – https://github.com/melezhik/sparrow-plugins/tree/master/service-config-reload

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا