سلام!
به مسابقه DevOps کدکاپ ۶ خوش آمدید.
به عنوان تمرین اول از شما میخواهیم تا اسکریپتی بنویسید که به دوآپس سلام کند! یعنی پس از اجرا صرفا عبارت زیر را چاپ کند.
به علامتهای نگارشی و بزرگی و کوچکی توجه کنید. خروجی اسکریپت شما باید دقیقا برابر مقدار خواسته شده باشد.
برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:
باید خروجی زیر را دهد:
برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
راهحل خود را درون فایل hello.sh
پیادهسازی کنید.
hello.sh
وارد نمایید.hello.sh
را آپلود کنید.عبدالله اخیرا به برنامهنویسی و نرمافزار علاقهمند شده و در مسابقات کدکاپ ثبتنام کرده است. اما متأسّفانه مسابقه DevOps کدکاپ با کنسرت عبدالله همزمان شده است و به کمک شما نیاز دارد. عبدالله دوست دارد در زمینهی Docker هم ستاره شود و منتور عبدالله به او گفته است «انسان در محدودیتها ستاره میشود» حالا او میخواهد چند محدودیت در منابع یک container قدیمی اعمال کند.
به عبدالله کمک کنید محدویتهای زیر را در منابع یک container داکر Redis اضافه کند:
30M
70
برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
۱. شما اجازهی build کردن یک Image جدید نخواهید داشت و باید از Imageهای استاندارد استفاده کنید. بهطور خاص، برای Redis میتوانید از Image با آدرس زیر استفاده کنید:
۲. نام container باید limited_redis
باشد.
۳. سیستم داوری کوئرا بهصورت خودکار فایل docker-compose.yml
را با کامند up
اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
۴. توجه داشته باشید که ورژن docker-compose.yml
باید 2
باشد.
شما تنها مجاز به ارسال فایل docker-compose.yml
هستید.
حتماً با اپلیکیشن مزخرفی بهنام واتساپ کار کردهاید. واتساپ در تیم مزخرف خود، به همکار خوبی مثل شما نیاز دارد تا بهعنوان یک مهندس، بتوانید این اپلیکیشن را بهبود دهید. یکی از مهمترین کارهایی که برای نگهداری و کارایی واتساپ نیاز است، ایجاد چندین سرور و پخش نمودن درخواستهای کاربران میان آنهاست.
برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
واتساپ، از قبل ۴ کانتینر برای apiهای خود تدارک دیده که شما از جزئیات apiها کاملاً بیخبر هستید و محتویات این apiها کاملاً محرمانه میباشد. این apiها، در فایل docker-compose.yml
وجود دارند و تنها کاری که شما باید انجام دهید، اضافه کردن یک سیستم لودبالانس بر روی پورت 80
این سیستم، در کنار بقیهی کانتینرها میباشد.
اضافه کردن یک container در فایل docker-compose.yml
که بر روی پورت 80
سرور فعال باشد و میان ۴ سرویس موجود، عملیات لودبالانس را بهصورت کاملاً مساوی انجام دهد. به این نکته توجه داشته باشید که این لودبالانس میان سرویسها باید کاملاً مساوی اتفاق بیوفتد و تمامی ریکوئستها دقیقاً میان سرویسها بهطور برابر پخش شوند.
فراموش نکنید که تنها میتوانید از ایمیجهای Standard در رجیستری کوئرا استفاده نمایید. فرقی نمیکند با چه ایمیج یا تکنولوژیای این کار را انجام دهید. حتی میتوانید خودتان برنامهای بنویسید که لودبالانس انجام دهد. تنها نکتهی مهم این است که بر روی پورت 80
آن برنامه را اجرا نمایید.
همچنین توجه داشته باشید ممکن است برچسب ایمیج موردنظر شما لزوما :latest
نباشد، برای مثال ایمیج HAProxy
تنها به دو صورت registry.gitlab.com/qio/standard/haproxy:2.5
و registry.gitlab.com/qio/standard/haproxy:2.5-alpine
وجود دارند.
شما اجازهی build کردن ایمیج جدید نخواهید داشت و در صورتی که میخواهید خودتان برنامهای بنویسید که کار لودبالانس را انجام دهد، باید از پوشهی data
که برای ایجاد volume در نظر گرفتیم استفاده کنید و برنامهی خود را به درون کانتینرهای موجود volume کنید. مثلاً برنامهای پایتونی نوشتهاید که در ایمیج پایتون استاندارد کوئرا volume میشود و در entrypoint آن را اجرا میکنید.
در صورتیکه نیاز دارید فایل یا مسیری را به درون هریک از containerها Volume کنید، میتوانید از پوشهای بهنام data
استفاده کنید. و برای ایجاد Volume از Relative Path استفاده کنید. برای مثال:
فراموش نکنید که فایل somefile
را درون پوشهی data
قرار داده و آن را برای داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
اگر محتوای پوشه data
تان خالی است، میتوانید این پوشه را ارسال نکنید.
توجه: سیستم داوری کوئرا بهصورت خودکار فایل docker-compose.yml
را با کامند up
اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
شما فقط میتوانید مسیرهای هایلایت شده را تغییر دهید:
در نهایت این پوشه را zip کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل zip شما، باید فایل docker-compose.yml
را ببینیم.
پیمان مسئول DevOps یک سایت شده که چند کاربر بَلا دارد که ریکوئستهای زیادی میزنند و پیمان میخواهد آنها را بلاک کند.
به پیمان کمک کنید از روی فایل لاگ nginx
بتواند آن دسته از IPهایی که بیشتر از n
ریکوئست در دقیقه زدهاند را با استفاده از iptables
بلاک کند. او برای این کار یک اسکریپت bash نیاز دارد که argumentهای آدرس فایل لاگ و عدد n را دریافت کند.
برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
۱. نمونه لاگ nginx
که در داوری استفاده میشود در فایل nginx_logs_sample
در پروژهی اولیه ( این لینک ) قرار دارد. بخشی از این لاگ نمونه:
۲. برای نمونه اسکریپتی که شما مینویسید با دستور زیر اجرا و داوری خواهد شد:
پس از اجرای دستور فوق با فایل لاگ نمونه که در پروژه اولیه در اختیارتان است، باید IP های زیر در iptables بلاک شوند:
شما تنها مجاز به ارسال فایل blocker.sh
هستید.
ایلانماسک برای ارسال یک ماهواره به مدار زمین، نیازمند یک کلاستر ردیس میباشد؛ اما او، پس از ریزش شدید dogecoin، بهشدت بیپول شده است و نمیتواند هزینهی اجارهی چند سرور ابری برای ایجاد یک کلاستر ردیس را پرداخت کند. بنابراین میخواهد یک کلاستر ردیس را بر روی چند docker container با کمک Ansible بالا بیاورد. او در این مسیر نیازمند کمک شماست.
برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
در ابتدای کار، برای ایجاد کانتینرهای ردیس، نیاز است که فایل docker-compose.yml
را تکمیل کنید. توجه داشته باشید که شما اجازهی build کردن یک Image جدید نخواهید داشت و باید از Imageهای استاندارد استفاده کنید. بهطور خاص، برای Redis میتوانید از Image زیر استفاده کنید:
توجه داشته باشید که باید فایل docker-compose.yml
را بهشکلی تکمیل کنید که پس از up
کردن آن، ۶ کانتینر Redis اجرا شوند که ۳ تا از آنها برای Nodeهای master و ۳ تای دیگر آنها برای Nodeهای slave استفاده خواهند شد. پس توجه داشته باشید که ما از شما انتظار داریم که به ازای هر Node اصلی، یک replica ایجاد شود همچنین network همهی کانتینرها host
باشد و در نظر داشته باشید ایمیج registry.gitlab.com/qio/standard/redis:latest
برابر با همان ایمیج redis
اصلی است و داکیومنت آن در این لینک قابل مشاهده است.
۱. نام containerها باید حتماً به شکل زیر باشد:
توجه کنید، آن کانتینری که نامش با master شروع میشود، در انتهای کار، باید واقعاً حاوی یک Node از ردیس Master باشد و آن کانتینری که نامش با slave شروع میشود، در انتهای کار، باید واقعاً حاوی یک Node از ردیس Slave یا replica باشد.
۲. هریک از این containerها باید روی پورت مشخصی که مربوط به آنها میباشد قرار گیرند. دقیقاً به شکل زیر:
در صورتیکه نیاز دارید فایل یا مسیری را به درون هریک از containerها Volume کنید، میتوانید از پوشهای بهنام data
استفاده کنید. و برای ایجاد Volume از Relative Path استفاده کنید. برای مثال:
فراموش نکنید که فایل somefile
را درون پوشهی data
قرارداده و آن را برای داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
درصورتی که علاقهمند به استفاده از پوشهی data
نیستید نیز مشکلی نیست و میتوانید آن را ارسال نکنید.
توجه: سیستم داوری کوئرا بهصورت خودکار فایل docker-compose.yml
را با کامند up
اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
پس از بالا آمدن containerهای Redis، که سیستم داوری کوئرا بهصورت خودکار آنها را با استفاده از فایل docker-compose.yml
شما بالا میآورد، شما نیازمند ایجاد هماهنگی میان این Nodeهای Redis خواهید بود. برای ایجاد این هماهنگی (یا اصطلاحاً ایجاد cluster)، میتوانید از Ansible استفاده کنید.
پس از بالا آمدن کامل همهی containerهای Redis، فایل site.yml
با دستور ansible-playbook
اجرا خواهد شد. شما میتوانید فایل cluster.yml
را به هر صورتی که نیاز دارید تغییر دهید، بهشکلی که cluster مربوط به Nodeهای Redis ایجاد شود.
توجه: شما در سیستم host، به redis-cli
دسترسی ندارید. در واقع، redis-server
در سیستم host نصب نیست. (راهنمایی: اما در تمامی Nodeها نصب است!)
در صورتی که علاقهمند به استفاده از Ansible برای اجرای کلاستر نیستید، میتوانید از آن استفاده نکنید. تمامی نمرهای که شما دریافت میکنید، مربوط به اجرای درست و دقیق کلاستر خواهد بود. پس اگر میتوانید بدون استفاده از Ansible، یک کلاستر ردیس میان ۶ کانتینر ایجاد کنید، این کار را انجام دهید. بههرحال این امکان برای شما وجود دارد که از Ansible برای اجرای دستوراتی که علاقهمند به اجرای آنها در سیستم host هستید استفاده کنید.
شما فقط میتوانید مسیرهای هایلایت شده را تغییر دهید:
در نهایت این پوشه را zip کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل zip شما، باید فایل docker-compose.yml
را ببینیم.