پروژههای ما معمولاً منطقهای هستند و مشتریان ما معمولاً وزارتخانهها هستند. با این حال، علاوه بر بخش دولتی، سیستمهای ما توسط سازمانهای خصوصی نیز استفاده میشوند. عملاً هیچ مشکلی با آنها وجود ندارد.
بنابراین، پروژههای اصلی ما منطقهای هستند و گاهی اوقات با مشکلاتی مواجه میشوند. برای مثال، در مورد عملکرد، وقتی ۲۰،۰۰۰ نفر از کاربران ارزشمند ما در مناطق مختلف در طول راهاندازی قابلیتهای جدید به سرورهای تولید حضور دارند. این یک دردسر است...
اسم من روسلان است و من در پشتیبانی از سیستمهای اطلاعاتی گروه BARS کار میکنم. توسعه یک ربات قاتل برای DBA های سریالی خشناین پست برای افراد ترسو مناسب نیست – نامهها و تصاویر زیادی وجود دارد.

/آور
برخی از برنامههای ما روی Oracle DBMS اجرا میشوند. ما همچنین پروژههایی روی PostgreSQL DBMS داریم. Oracle یک ویژگی فوقالعاده به نام Automatic Workload Repository (AWR) دارد - ابزاری برای جمعآوری آمار حجم کار DBMS که مشکلات موجود را برجسته میکند و حتی توصیههایی برای رفع آنها ارائه میدهد. در یک مقطع (یعنی در زمان مشکلات زیاد)، توسعهدهندگان دائماً درخواست این ویژگی را داشتند. گزارشهای AWR برای تحلیل عملکردما وظیفه شناسانه به سرور DBMS رفتیم، گزارشها را جمعآوری کردیم، آنها را بیرون آوردیم و برای تجزیه و تحلیل به بخش تولید فرستادیم. بعد از پنجمین بار، آزاردهنده شد... بعد از دهمین بار، آزاردهندهتر شد...
روزی یکی از همکارانم پیشنهاد داد که هر کاری که بیش از یک بار انجام میشود، باید خودکار شود. راستش را بخواهید، تا قبل از اینکه اذیت شوم، واقعاً به این موضوع فکر نکرده بودم و سعی کردم هر چیزی را که میتوان خودکار کرد، خودکار کنم، اما اغلب تقاضایی برای آن وجود نداشت و بیشتر جنبه اکتشافی داشت تا عملی.
و بعد فکر کردم: «برای تهیه گزارش نیازی به مدیران نیست...»... از این گذشته، جمعآوری یک گزارش به معنای اجرای اسکریپت SQL @$ORACLE_HOME/rdbms/admin/awrrpt.sql و دریافت گزارش از سرور است... اوه بله، ما اجازه توسعه به محیط عملیاتی را نمیدهیم.
بنابراین اطلاعات لازم را در گوگل جستجو کردم، تابع مورد نظر را از مقاله روی یک پایگاه داده آزمایشی ایجاد کردم، اسکریپت را اجرا کردم و ناگهان، گزارش آماده شد و میتوانست به صورت محلی ذخیره شود. من توابعی را ایجاد کردم که در آنها گزارشهای AWR اغلب مورد نیاز بودند و نحوه استفاده از آنها را برای توسعهدهندگان توضیح دادم.
تقریباً در همین زمان، بعد از چت با @BotFather، برای سرگرمی یک ربات تلگرام ساختم. چند قابلیت ساده - نمایش زمان فعلی، نرخ ارز و آب و هوا - به آن اضافه کردم و به آن یاد دادم که طبق یک برنامه زمانی برای همسرم (که آن زمان هنوز دوست دخترم بود) پیامهای تبریک بفرستد. ارسال پیامهای تبریک احتمالاً محبوبترین ویژگی ربات من در آن زمان بود و همسرم از آن قدردانی میکرد.
خب. توسعهدهندگان در تلگرام برای ما نامه مینویسند، ما در تلگرام برایشان گزارش میفرستیم... اما اگر آنها به جای ما برای ربات نامه بنویسند چه؟ برای همه بهتر خواهد بود، گزارش سریعتر دریافت میشود و از همه مهمتر، ما را درگیر نمیکند. به این ترتیب ایده اولین ویژگی بسیار درخواستی برای ربات من متولد شد.
من شروع به پیادهسازی آن کردم. من تمام تلاشم را در PHP انجام دادم (در واقع برنامه ما با PHP است که من در آن از مثلاً پایتون مهارت بیشتری دارم). من خیلی کدنویس نیستم، بنابراین کد خودم را به شما نشان نمیدهم :)
این ربات در شبکه شرکتی ما قرار دارد و به پروژههای خاص، از جمله پایگاههای داده هدف، دسترسی دارد. برای جلوگیری از تداخل با پارامترهای دستور یا منوها، این قابلیت را در چت گروهی با اعلانهای نظارتی ادغام کردم. به این ترتیب، ربات بلافاصله میداند از کدام پایگاه داده برای گزارشدهی استفاده کند.
پس از دریافت فرمانی از نوع /awr Nکه در آن N تعداد ساعات کاملی است که برای آن به گزارش نیاز است (به طور پیشفرض، ۱ ساعت)، حتی برای یک هفته، اگر پایگاه داده مجدداً راهاندازی نشده باشد، ربات بلافاصله شروع به کار میکند، گزارش را جمعآوری میکند، آن را به عنوان یک صفحه وب منتشر میکند و بلافاصله (تقریباً بلافاصله) پیوندی به گزارش مورد نیاز ارائه میدهد.
لینک را دنبال کنید و این هم گزارش AWR:

همانطور که انتظار میرفت، توسعهدهندگان به خوبی از پس تولید این گزارش برآمدند و حتی کسی از آنها تشکر کرد.
مدیران پروژه از مناطق دیگر نیز با قدردانی از راحتی تیم، همین را میخواستند، زیرا اغلب به دلیل نگرانی در مورد عملکرد و در دسترس بودن سیستم، بیشترین انتقاد مشتری را دریافت میکنند. من این ربات را به چتهای دیگر نیز اضافه کردم. آنها هنوز از آن استفاده میکنند و من از این بابت خوشحالم.
بعداً، همکارانم در CIT از نحوه جمعآوری گزارشهای ما مطلع شدند و خواستند به ما بپیوندند. من آنها را به چتهایمان اضافه نکردم، بلکه در عوض یک چت جداگانه برای تولید گزارشهای زمانبندیشده و بر اساس تقاضا ایجاد کردم.
/pgBadger
ما همچنین برنامههای کاربردی دیگری در PHP در رابطه با PostgreSQL داریم. جمعآوری گزارش pgBadger برای افراد نیازمند با استفاده از همان اصل - در چتهای گروهی - پیادهسازی شد. ما اول از آن استفاده کردیم، اما بعد دیگر استفاده نکردیم. این قابلیت به دلیل غیرضروری بودن حذف شد.
/وظیفه
دپارتمان ما شیفت شب دارد و بر این اساس، برنامهای هم دارد. این برنامه در گوگل شیت ذخیره میشود. همیشه راحت نیست که دنبال لینک بگردید، برنامه را باز کنید و خودتان آن را جستجو کنید... یکی از همکاران سابقم هم با ربات تلگرامش کار کرد و آن را در چت دپارتمان ما پیادهسازی کرد. اطلاعیههایی درباره شروع شیفت کاری کارمندان بخش. این ربات برنامه را تجزیه و تحلیل میکند، فرد در حال انجام وظیفه را بر اساس تاریخ فعلی شناسایی میکند و بر اساس برنامه یا بنا به درخواست، به اطلاع میرساند که امروز چه کسی در حال انجام وظیفه است. این عالی و راحت است. با این حال، من از قالب پیام خیلی راضی نبودم. همچنین، کارمندان یک بخش دیگر (به عنوان مثال، مرکز تجارت پزشکی) واقعاً به اطلاعات مربوط به افراد در حال انجام وظیفه در مناطق دیگر نیاز ندارند، اما در صورت بروز مشکل باید بدانند چه کسی در بخش پزشکی در حال انجام وظیفه است. من تصمیم گرفتم این قابلیت را "قرض" بگیرم اما آنچه را که دوست نداشتم تغییر دهم. من یک قالب پیام ایجاد کردم که برای من و دیگران راحت باشد و اطلاعات غیرضروری را حذف کنم.
/tnls
بعد از اینکه اتوماسیون را از طریق یک ربات تلگرام امتحان کردم، ایدههای مختلف زیادی داشتم، اما میخواستم کارهای کاملاً ضروری را انجام دهم. تصمیم گرفتم ادامه دهم آمار مربوط به درخواستهای تجدیدنظر برای دسترسی به پروژههای مشتریانمان، ما یک سرور به اصطلاح "hopper server" یا سرور فورواردینگ پیادهسازی کردهایم. اتصالات VPN روی آن برقرار میشوند و سپس پورتهای برنامه، پایگاههای داده و سایر سرویسهای فورواردینگ کمکی از طریق SSH به شبکه محلی ما فوروارد میشوند و دسترسی راحت به پروژههای کارمندانمان را بدون دردسر اتصالات VPN تضمین میکنند. کافیست یک اتصال VPN به شبکه شرکتی ما راهاندازی کنید.
آمار درخواستها نشان میدهد که اغلب، پس از اینکه یک تونل از کار میافتد (به دلیل مشکلات شبکه، مانند اتمام زمان)، افراد در مورد بازیابی دسترسی به پروژه سوال میکنند. در بیشتر موارد، راهاندازی مجدد اتصال کافی است و همه چیز درست میشود. بنابراین، بیایید خودمان این کار را انجام دهیم. دستور زیر را اجرا کنید:

شما وارد آیتم منوی مورد نظر میشوید، پروژه خود را انتخاب میکنید، یک دقیقه صبر میکنید و همه خوشحال و راضی هستند...
با دریافت یک دستور، با یک اشاره انگشت، ربات به سرور فورواردینگ متصل میشود، از قبل میداند که کدام فورواردینگ باید دوباره راهاندازی شود و کار خود را انجام میدهد - اتصال به پروژه را بازیابی میکند. من دستورالعملهایی نوشتم تا کاربران بتوانند چنین مشکلاتی را بهطور مستقل حل کنند. افراد فقط در صورتی با ما تماس میگرفتند که ابزار ارائه شده کار نمیکرد...
/ecp_to_pem
آمار بیشتر نشان داد که اغلب تبدیل [به پول رایج] ضروری است امضای دیجیتال Crypto Pro با فرمت PEM() برای ادغامهای مختلف، و ما تعداد زیادی از آنها را داریم. وظیفه: شما یک کانتینر برمیدارید، آن را با ... در رایانه کپی میکنید. Windows با نصب ابزار P12FromGostCSP (ضمناً پولی است)، آن را به pfx تبدیل میکنید و سپس pfx را با استفاده از OpenSSL (که از رمزگذاری GOST پشتیبانی میکند) به pem تبدیل میکنید. خیلی راحت نیست، اما میخواهم به راحتی یک کلیک باشد.
گوگل دوباره به کمک آمد. آن را پیدا کرد. من آن را همانطور که در README توضیح داده شده است، کامپایل کردم و کار کرد. من ربات را برای استفاده از این ابزار آموزش دادم و تقریباً تبدیل فوری را دریافت کردم.

تا زمانی که پیادهسازی نهایی تکمیل شد، دستوری برای انتقال به یک قالب رمزگذاری جدید - GOST-2012 - صادر شد. تا آنجا که من به یاد دارم، این ابزار در آن زمان فقط با GOST قدیمی (2001) کار میکرد. شاید این یک ابزار کاملاً متفاوت و مشابه از یک نوع دیگر بود؛ دقیقاً به خاطر نمیآورم.
بعد از تغییر به استاندارد جدید GOST، به دلایل امنیتی قابلیت ربات را حذف کردم. آن را در یک کانتینر داکر پیادهسازی کردم.
داکرفایل، در صورتی که کسی به آن نیاز داشته باشد:
FROM ubuntu:16.04
RUN apt update && apt -y install git sudo wget unzip gcc g++ make &&
cd /srv/ && git clone https://github.com/kov-serg/get-cpcert.git &&
cd get-cpcert && chmod +x *.sh && ./prepare.sh && ./build.sh &&
mkdir -p /srv/{in,out} &&
echo '#!/bin/bash' > /srv/getpem.sh &&
echo 'cd /srv/get-cpcert' >> /srv/getpem.sh &&
echo './get-cpcert /srv/in/$CONT.000 $PASS > /srv/out/$CONT.pem' >> /srv/getpem.sh &&
chmod +x /srv/getpem.sh ENTRYPOINT /srv/getpem.shبرای تبدیل، باید کانتینر منبع (دایرکتوری مانند xxx.000) را در دایرکتوری /srv/in قرار دهید و pem تکمیلشده را از /srv/out بازیابی کنید.
برای تبدیل، مراحل زیر را دنبال کنید:
docker run -t -i -e CONT='<имя директории с контейнером(без ".000")>' -e PASS='<пароль для контейнера>' -v /srv/in:/srv/in -v /srv/out:/srv/out --name ecptopem <адрес нашего репозитория>/med/ecptopem:latest /emstop و /emstart
روزی، یک مدیر پایگاه داده اوراکل واقعاً باحال با تجربه گسترده در مدیریت و توسعه DBMS به شرکت ما پیوست. از همان ابتدا، او در اتصال به سرورهای DBMS از طریق SSH مشکل داشت: نمیتوانست بفهمد کجا یا چگونه متصل شود، جزئیات دسترسی نامشخص بود، یا نمیتوانست چیزی را که نیاز داشت ارسال کند. ما خوشحال شدیم که کمک کنیم، نحوه اتصال را توضیح دادیم و Enterprise Manager را برای او تنظیم کردیم. اما SSH هنوز کارساز نبود. یکی از همکاران ما به سادگی توضیح داد: او یک مدیر پایگاه داده اصیل است. 🙂 ما تصمیم گرفتیم که اگر چیزی نیاز به تغییر در سرور داشته باشد، خودمان آن را انجام دهیم.
EM گاهی اوقات تحت بار سنگین از کار میافتد و برای راهاندازی مجدد آن... باید از طریق SSH متصل شوید و آن را از طریق ترمینال راهاندازی مجدد کنید. همکار جدید ما تصمیم گرفت: «مدیران در این کار مهارت دارند». بارهای سنگین DBMS در اینجا غیرمعمول نیستند و درخواستها برای راهاندازی مجدد EM رایج شدهاند. سپس همان سناریو رخ میدهد: استرس، ناراحتی و جستجوی راهحل. بنابراین، در همان چتهای گروهی، دستورات زیر ظاهر شدند: /emstop و /emstart.

/کشتن
اگر درگیری شدیدی در پایگاه داده وجود دارد، که گاهی اوقات اتفاق میافتد، لازم است که به سرعت پایگاه داده را تخلیه کنید. سریعترین راه، متوقف کردن فرآیند مشکلساز است... برای انجام این کار، از طریق SSH متصل شوید، kill -9... ربات کمک خواهد کرد!

الکسی از تیم قدردانی کرد و نامی محبت آمیز به آن داد - «کیلالکا» یا یک اسلحه.
یک روز، بعد از اینکه دیدم الکسی تقلا میکند و زجر میکشد و هر بار برای هر یک از فرآیندها /kill xxx را تایپ میکند، تصمیم گرفتم «چند لوله» را به تفنگمان اضافه کنم:

بهتره! همه چیز برای توئه، الکسی، فقط به کارت ادامه بده عزیزم!
طبیعتاً چنین تیم مهمی محدود بود دسترسی توسط user_id - "بدون خطا". با دیدن اینکه لشا چگونه ماهرانه فرآیندها را روی سرور پایگاه داده از بین میبرد، چندین نفر سعی کردند دستوری با شماره فرآیند تصادفی وارد کنند، اما ربات هوشمند من فریب نخورد؛ بلافاصله امتناع کرد.
/هشدارنامه
خب، محض احتیاط، من این دستور را زدم:
/alertlog <تعداد خطوط> — تعداد مشخص شده خطوط alertlog را دریافت کنید
ربات گزارش هشدار را دریافت کرده و آن را به سرویس ما، یک سرویس شبیه به pastebin به نام pyste، ارسال میکند و در چت درخواست، لینکی را به آن paste ارسال میکند.
/چکها
سپس یک درخواست وارد شد نظارت بر عملکرد واقعی برنامه ما. تاکنون، تیم پشتیبانی فنی پروژه این دادهها را به صورت دستی جمعآوری میکرده است. این درست نیست! آزمایشکنندگان شجاع ما برای این منظور، موارد آزمایشی (test case) ایجاد کردهاند. گزارشهای آزمایشی حاصل چندان کاربرپسند نیستند؛ یک کاربر بیتجربه مدت زیادی را صرف فهمیدن آن میکند و ممکن است نتواند اطلاعات مورد نیاز خود را استخراج کند. و ما دوست نداریم کارهایی را که میتوان بدون دخالت دستی انجام داد، به صورت دستی انجام دهیم... یک چالش جدید برای ربات!

دستور /checks یک منوی ساده و سرراست تولید میکند؛ این بار، بچههای ما یاد گرفتند که بدون دستورالعمل از این دستور استفاده کنند!
وقتی مورد دلخواه را انتخاب میکنید، به جای یک منو، اعلانی درباره شروع آزمون ظاهر میشود تا کاربران بیصبر، آزمون ما را ۱۰۰۵۰۰ بار اجرا نکنند:

بسته به مورد انتخاب شده در منو، یک تست خاص از شبکه ما، یعنی از دستگاهی که ربات در آن قرار دارد (jmeter از قبل در آنجا پیکربندی شده است، تستهای لازم در آن قرار دارند و غیره) یا مستقیماً از مرکز داده (از یک دستگاه آماده در کنار برنامه) اجرا میشود تا تأخیر شبکه در حین آزمایش از بین برود یا حداقل به حداقل برسد.
پس از اتمام آزمایش و دریافت گزارش، ربات آن را تجزیه و تحلیل میکند و نتیجه را در قالبی قابل خواندن توسط انسان تولید میکند:

مجموعه معیارها
این قابلیت بسیار مورد توجه قرار گرفت و مدیران پروژه مشتاق، آن را برای مناطق خود دریافت کردند. یکی از مدیران پروژه دلسوز اعلام کرد: «من میخواهم آمار مبتنی بر زمان داشته باشم!» شخصی از مرکز فناوری اطلاعات مرکزی پیشنهاد داد که نظارت بر همه این موارد در Zabbix راحت خواهد بود. زبیکس، پس زبیکس…
فکر کردم باید برای نیاز به تکرار راهحل آماده شوم... این ایده را در یک کانتینر داکر پیادهسازی کردم. JMeter در یک کانتینر طبق یک برنامه (هر 10 دقیقه) اجرا میشود، گزارش را در یک مکان خاص ذخیره میکند، PHP آن را تجزیه میکند و دادههای مورد نیاز را به عنوان یک صفحه وب خروجی میدهد. Zabbix از کلید web.page.get برای بازیابی این صفحه استفاده میکند، از یک عبارت منظم برای انتخاب دادههای مورد نیاز برای عناصر وابسته خاص استفاده میکند و نمودار را رسم میکند.

فکر میکنم خیلی خوب از آب درآمد. با نگاه کردن به نمودار، میتوانیم اولاً سرعت تقریبی برنامه را ببینیم و اگر هرگونه افزایش ناگهانی در نمودار را تشخیص دهیم، میتوانیم تقریباً مشخص کنیم که گلوگاه کجاست. ساده است. تاکنون، فقط در یک منطقه مفید بوده است، اما من آمادهام تا آن را برای هر کسی که علاقهمند باشد، ارائه دهم.
اصلاح برنامه
آمار کارهای مشابه اخیراً ایدههایی برای سادهسازی و تسهیل کارم به من داد. برخی پروژهها نیاز به نصب محفظههای کلید Crypto Pro روی سرورهای برنامه دارند. تعدادشان زیاد است و امضاهای دیجیتال به مرور زمان منقضی میشوند. گاهی اوقات روزانه دو کار دریافت میکنم. اما استفاده از یک ربات برای این اهداف را ناامن میدانستم و تصمیم گرفتم این قابلیت را مستقیماً در برنامه پیادهسازی کنم. طبیعتاً، این کار نیاز به تأیید مجوز و حقوق دسترسی دارد. اگر امتیازات لازم رعایت شود، یک آیتم منوی اضافی برای کار با امضاهای دیجیتال، نصب، حذف، مشاهده اطلاعات و غیره در دسترس خواهد بود. این قابلیت در حال حاضر در دست توسعه است. معلوم شد که خیلی سخت نیست؛ فقط باید دستورالعملهای موجود را بخوانم، به مثالهای کد نگاه کنم، از همکاران باتجربهتر بپرسم و سپس آن را انجام دهم. در حین تحقیق، ایدههایی برای اضافه کردن به برنامه به ذهنم رسید. من هیچ برنامه بزرگی نخواهم ریخت - توسعه در حال انجام است، بنابراین بگذارید هر کسی کار خودش را انجام دهد. اما فعلاً، من فقط خودم این کار را انجام میدهم.
طرح
همانطور که گفتم، ایدههای مختلف زیادی برای استفاده از ربات و چیزهای دیگر به ذهنم رسید - اساساً، ایدههایی برای «نقاط اتوماسیون». بسیاری از آنها فراموش شدند زیرا وقت نداشتم آنها را بنویسم. حالا سعی میکنم هر چیزی را که به ذهنم میرسد بنویسم و به دیگران هم توصیه میکنم همین کار را بکنند.
با این حال، الکسی هرگز فراموش نمیکند که آرزوهای خودش را به اشتراک بگذارد. از جمله آخرین آنها:
/kill_sql SQL_ID — با این کوئری SQL_ID تمام سشنها را از بین ببرید
/kill_block - جلسه مسدود کردن ریشه را از بین ببرید
/نمایش_اِم — نمایش تصویر عملکرد EM
اونی که حیلهگره میخواد از گوشیش DBA کنه =)
اینگونه است که ما برای خیر و صلاح سرزمین مادری تلاش میکنیم!
چگونه خود را از کارهای روزمره و بیاهمیت رها میکنید؟
امیدوارم این مطلب جالب بوده باشد، و شاید حتی برای کسی مفید بوده باشد، و من وقت نداشتم که خواننده را خسته کنم... برای همه ما آرزوی موفقیت دارم.
منبع: www.habr.com
