خودکارسازی در بسیاری از موارد مهم‌ترین و کلیدی‌ترین جنبه‌ی فرآیند DevOps محسوب می‌شه. چون هر چی تیم عملیاتی و توسعه‌دهنده‌ها زمان بیش‌تری رو صرف کارهای تکراری بکنن، روند انجام کارها کندتر می‌شه و انعطاف‌پذیری کاهش پیدا می‌کنه.
ابزارهای مختلف استقرار برنامه هم با خودکارسازی بسیاری از وظایف، روند توزیع برنامه‌ و به‌روزرسانی‌ها رو تا حد ممکن راحت‌تر می‌کنن تا توسعه‌دهنده‌های نرم‌افزار بتونن روی کارهای اساسی‌تر مثل کدنویسی، تمرکز بیش‌تر داشته باشن.

ابزارهای مختلف استقرار برنامه با انواع پلتفرم‌ها و زیرساخت‌ها سازگار هستن و ساده‌سازی جریان کار رو در محیط دلخواه، راحت‌تر می‌کنن. علاوه بر این، به توسعه‌دهنده‌‌ها اجازه می‌دن تا در حین انجام پروژه‌ها، میزان پیشرفت رو دنبال کرده و تغییرات رو مدیریت کنن.

درمقاله گذشته به معرفی ابزارهای توسعه و ساخت پرداختیم. دراین پست تصمیم داریم ابزارهای استقرار برنامه‌ رو براتون توضیح بدیم. برای این کار ابزارهای استقرار رو به سه زیر مجموعه‌‌ی زیر تقسیم‌بندی کردیم که در ادامه با اون‌ها بیش‌تر آشنا می‌شین:

  • ابزارهای مدیریت artifact 
  • ابزارهای مدیریت پیکربندی
  • ابزارهای استقرار

ابزار مدیریت Artifact سال ۲۰۲۰: Nexus

اول از همه، بیایین با تعریف "artifact" در رابطه با توسعه‌ی نرم‌افزار شروع کنیم.

artifact هر سند یا هر چیز قابل تحویل مرتبط با یک پروژه هست و معمولا به صورت یک بسته‌ی باینری بزرگ ذخیره می‌شه.

artifact به توصیف تابع، معماری و طرح نرم‌افزار در حال توسعه، کمک می‌کنه.
source code‌‌ها، دیاگرام‌های جریان کار، مدل‌های داده، use case‌ها، نمونه‌های اولیه و برنامه‌ی کامپایل شده همه می‌تونن به عنوان artifact در نظر گرفته بشن. 

در طول چرخه‌ی عمر توسعه‌ی سیستم‌ها، معمولا در طول مراحل برنامه‌ریزی، لیستی تهیه می‌شه که تمام artifact‌های مورد نیازی که باید تولید بشن رو پوشش می‌ده.

بعد از اون، این artifact‌ها با بقیه‌ی اعضای تیم در یک درایو یا مخزن artifact، به اشتراک گذاشته می‌شه.

مخزن artifact، که می‌تونیم اونو ابزاری برای مدیریت artifact ها هم بنامیم، به برنامه‌ای گفته می‌شه که برای ذخیره، ورژن‌بندی و استقرار artifact‌ها طراحی شده.

ابزارهای مدیریت artifact

ابزارهای مدیریت artifact، که به عنوان مخزن‌های artifact هم شناخته می‌شن، برای ذخیره، سازماندهی و توزیع artifact‌ها (یعنی فایل‌های باینری به علاوه‌ی metadata های اون‌ها) در یک مکان متمرکز، استفاده می‌شن.
با استفاده از این ابزارها، تیم توسعه‌دهنده می‌تونه زمان کم‌تری رو صرف دانلود وابستگی‌ها بکنه و علاوه بر این، می‌تونه ورژن مناسبی از artifact های مورد نظر رو پیدا کنه. 

معرفی Nexus: ابزار مدیریت artifact

Nexus مدیر مخزنی است که artifact‌های مورد نیاز برای توسعه رو سازماندهی، ذخیره و توزیع می‌کنه.

Nexus، به توزیع راحت برنامه کمک می‌کنه و با استفاده از اون، توسعه‌دهنده‌ها می‌تونن نحوه‌ی دسترسی و استقرار هر artifact رو از یک مکان واحد، کنترل کنن.

معمولاً برای میزبانی Apache Maven ازش استفاده می‌شه. در حال حاضر از APT ،OBR ،P2 ،Docker ،RubyGems ،npm ،NuGet ،Maven/ Java و YUM و...، پشتیبانی می‌کنه و شما می‌تونین از این ابزار واحد برای ذخیره‌ی همه‌ی artifact های قابل استقرار تون استفاده کنین.

  • اجرای یک مدیر مخزن داخلی، همکاری کارآمد بین توسعه‌دهنده‌ها و تیم‌ها رو به همراه داره:

وقتی یک تیم، کتابخونه‌ی جدیدی رو ایجاد می‌کنه، اون رو به مدیر مخزن ارسال می‌کنه. بعد تیم‌های دیگه می‌تونن به صورت کاملا استاندارد، به این کتابخونه‌ها دسترسی پیدا کنن.  و اگه تیم‌های توسعه‌دهنده‌ی شما، برنامه‌هایی رو برای استقرار به یک گروه عملیاتی تحویل می‌دن، اون‌ها می‌تونن از یک مدیر مخزن به عنوان روشی برای به اشتراک گذاشتن محصولات نهایی استفاده کنن.

مزیت‌های اصلی

  • پشتیبانی

این محصول از سال ۲۰۱۳ وارد بازار شده.

بنابراین می‌شه گفت یک محصول پایداره و البته از پشتیبانی خیلی خوبی هم برخورداره. 

  • متن‌باز بودن 

نسخه‌ی رایگان Nexus، امکانات اصلی که تیم‌های توسعه به اون‌ها نیاز دارند رو در بر داره، اما شما می‌تونین با پرداخت مبلغ مشخص، از ویژگی‌های اضافی دیگه‌ استفاده کنین، که بسته به اندازه و نیاز سازمان‌ شما، با خودشون ارزش‌های مختلفی رو به همراه دارن. 

. . .

ابزار مدیریت پیکربندی سال ۲۰۲۰: Ansible 

مدیریت پیکربندی، فرآیندی است برای مدیریت تغییرات در یک سیستم، به طوری که از به‌روزرسانی‌های یکپارچه در طول زمان اطمینان حاصل بشه. 

این اصطلاح عموما برای اشاره به مدیریت پیکربندی سرورها استفاده می‌شه. مدیریت پیکربندی، معمولاً به IT Automation یا Server Orchestration، هم اشاره می‌کنه. هر دو عبارت به جنبه‌های عملی مدیریت پیکربندی و توانایی کنترل چندین سیستم از طریق یک سرور مرکزی، تاکید می‌کنن.  

بررسی چالش‌

قبل از این‌که به شما بگم Ansible چیه، خوبه که با چالش‌هایی که قبلا برای مدیریت پیکربندی وجود داشت آشنا بشین.
تا قبل از این مدیران سیستم، برای مدیریت سرورها باید به صورت دستی نرم‌افزارهای لازم رو نصب می‌کردن، پیکربندی‌ها رو تغییر می‌دادن و سرویس‌ها رو روی سرور های شخصی مدیریت می‌کردن. 

علاوه بر این، چون همون‌طور که می‌دونین تیم‌های توسعه‌دهنده، به عنوان تیم چابک، به طور مرتب نسخه‌های مختلفی از نرم‌افزار رو منتشر می‌کنن، مدیران سیستم فهمیدند که با مدیریت پیکربندی به شکل دستی، ممکنه در سرعت کار توسعه‌دهنده‌ها اختلال ایجاد بشه. 

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

باید به شما اینو بگم که یک راه‌حل برای مشکل‌های گفته شده در بالا وجود داره:

 بله، استفاده از ابزار مدیریت پیکربندی Ansible.

آشنایی با کامپوننت‌های Ansible

قبل از این‌که بخوام همه چیز رو در مورد Ansible براتون توضیح بدم، بذارین شما رو با چند کامپوننت موجود در Ansible آشنا کنم:

  • Controller Machine: دستگاهی که Ansible در اون نصب شده و وظیفه‌ی ارائه‌ی خدمات از راه دور و اجرای پیکربندی لازم روی سرورهایی که مدیریت می‌کنین رو بر عهده داره.  
  • Inventory: فایلی، که حاوی اطلاعات سرورهایی هست که دارین مدیریت می‌کنین. در واقع با استفاده از Inventory، فهرستی از سیستم‌ها و دستگاه‌هایی که قرار هستند بوسیله‌ی Ansible مدیریت بشن رو مشخص می‌کنیم. این سیستم‌ها و دستگاه‌ها با عنوان host در Inventory شناخته می‌شن. 
  • Playbook: دستورالعمل‌هایی که با استفاده از اون‌ها می‌تونین نحوه‌ی مدیریت host‌ها رو مشخص کنین.
    playbook از زبان YAML که یک زبان پیکربندی ساده هست، برای ساختار دستورالعمل‌های خودش استفاده می‌کنه. 
  • Task: به بلوکی گفته می‌شه که یک procedure واحد رو برای اجرا تعریف می‌کنه، مثلا نصب یک بسته.
  • Ansible :Module، یک ابزار ماژولار هست و ماژول‌ها هم یک واحد کاری در Ansible به حساب می‌آیند و هر کدوم از اون‌ها می‌تونن به صورت تنها و بدون وابستگی کار کنن.
    Ansible ماژول‌های داخلی زیادی داره، اما شما می‌تونین ماژول‌های دلخواه خودتون رو هم ایجاد کنین.
  • Role: روشی از پیش تعریف شده هست برای سازمان‌دهی playbook‌ها و سایر فایل‌ها.
    در واقع هر Role، یک playbook هست که از یک یا چند playbook تشکیل شده و به کمک اون می‌تونین عملیاتی رو روی یک host انجام بدین.  
  • Play: یک task در playbook هست که توسط playbook اجرا می‌شه. در واقع به اجرای یک playbook، یک play گفته می‌شه. 
  • Facts: متغیرهای سراسری که با استفاده از اون می‌شه اطلاعاتی اعم از نوع سیستم‌عامل، آدرس IP، مشخصات CPU، میزان RAM و ...، رو از host دریافت کرد. 
  • Handlers: یک task داخل playbook هست که با استفاده از اون می‌شه، error‌ها رو handle کرد.

Ansible چیست؟

ابزارهای مختلف استقرار برنامه‌ها

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

Ansible هم ابزار یا پلتفرم خودکارسازی متن‌باز است که برای کارهایی مثل مدیریت پیکربندی، استقرار برنامه‌ها و...، ازش استفاده می‌شه و تونسته به سرعت در بین چند ابزار محبوب خودکارسازی در دنیا قرار بگیره. 

Ansible ابزار مفیدی هست که به شما امکان می‌ده گروهی از سیستم‌ها رو تعریف کنین، نحوه‌ی پیکربندی این سیستم‌ها یا اقدامات مربوط به اون‌ها رو توصیف کنین. Ansible برای انجام شدن این کارها، همه‌ی دستورها رو از یک مکان مرکزی صادر می‌کنه.

هیچ نرم افزار client دیگه‌ای روی سیستم‌های کلاینت نصب نمی‌شه. از پروتکل SSH برای اتصال به کلاینت‌ها استفاده می‌کنه. Ansible فقط باید روی control machine نصب بشه که حتی می‌تونه لپ‌تاپ شما باشه. این یک راه‌حل ساده برای حل یک مسئله‌ی پیچیده است.

مزیت‌های Ansible

حالا که دیدیم Ansible چیه، بیایین مزایای مختلف Ansible رو با هم مرور کنیم:

  • رایگان و متن‌باز بودن

 مشابه Ansible ،CentOs توسط کمپانی RedHat اداره می‌شه. این شرکت و سطح بالای پشتیبانی اون، به حفظ جامعه‌ی کاربری که دارن از این ابزار استفاده می‌کنن، کمک می‌کنه.

  • ساده بودن راه‌اندازی و استفاده 

 با استفاده از Ansible، همیشه اطمینان دارین از ماژول‌هایی استفاده می‌کنین که کیفیت بالایی دارن و استفاده از اون‌ها خیلی راحته. مثلا استفاده از  playbook های Ansibe، به مهارت برنامه‌نویسی خاصی نیاز نداره.

  • Agentless

یعنی نیازی به نصب Agent روی سیستم کلاینتی که می‌خواین اون رو خودکار کنین، نیست. همچنین نیازی نیست که یک ساختار مدیریت جداگانه‌ای تنظیم کنین.

  • کارآمد

از اون‌جایی که نیازی به نصب هیچ نرم‌افزار اضافی نیست، روی سرور شما فضای بیش‌تری در اختیار resource های برنامه قرار می‌گیره.

  • Stateless 

playbookهای Ansible، از طریق یک دستگاه مرکزی اجرا می‌شن و به گروهی از سرورها، سرویس‌دهی می‌کنن. 

وضعیت object از راه دور دیگه اهمیتی نداره و این باعث می‌شه استفاده از ابزاری مثل Packer برای ساخت object های قابل استقرار، راحت‌تر بشه. 

  • تست Molecule 

فریم‌ورک molecule، برای تست roleهای Ansible، به صورت یکپارچه عمل می‌کنه تا اطمینان حاصل بشه پیکربندی، اون کیفیت کافی رو داره و از CI/CD pipeline پیروی می‌کنه. 

  • YAML

 در مقایسه با سایر ابزارها، شما خیلی راحت‌تر می‌تونین با YAML کار کنین. از اون‌جایی که مدیریت پیکربندی معمولاً برای هرکسی که وارد حوزه‌ی DevOps شده، موضوع جدیدی هست، استفاده‌ی راحت از امکانات Ansible، یکی از عوامل اصلی فروش بالای این محصول شناخته شده.  

ابزار مناسب برای پیروزی در رقابت

ابزارهای مختلف استقرار برنامه‌ دیگه‌ای هم وجود دارند که توی این دسته محبوب هستن. اما خب به خوبی Ansible نیستن!

  • OpsCode Chef 

همان‌طور که گفتیم ابزار مدیریت پیکربندی، نرم‌افزاریه که می‌تونه سیستم‌ها رو با استفاده از مجموعه تنظیمات از پیش تعیین شده، پیکربندی کنه. 

فرض کنین بخواین فایل  etc/host/ رو روی همه‌ی سیستم‌هاتون با استفاده از SSH، به روز کنین.

یک راه اینه که می‌تونین از طریق SSH، به همه‌ی سیستم‌ها لاگین کنین و فایل موجود در host ها رو با استفاده از host name و IP address جدید تغییر بدین.
یک راه دیگر هم اینه که می‌تونین نوعی اسکریپت بنویسن که فایل‌تون رو با داده‌هایی که می‌خواین به روز کنه. وقتی کارها ساده و تعداد هاست‌ها (میزبان‌ها)، کم‌تر باشن، می‌تونین از زبان‌های برنامه‌نویسی مثل Ruby وPython استفاده کنین. اما برای استفاده از این‌ها محدودیت‌هایی وجود داره و علاوه بر این ممکنه خطاهایی هم در حین استفاده از اون‌ها رخ بده. 

اما ابزارهای مدیریت پیکربندی می‌تونن برای پیکربندی راحت‌تر سیستم‌ها به ما کمک کنن. 

OpsCode Chef یکی از ابزارهای مدیریت پیکربندی مشابه Puppet ،Ansible و Saltstack هست که می‌تونه برای شما مناسب باشه. 

Ruby و Chef، خیلی نزدیک به هم هستن، اما اون‌ها نمی‌تونن به راحتی مشکل‌ برنامه‌های stateless و ابری رو حل کنن.

  • Puppet

می‌تونین برای تعریف Infrastructure as code، مدیریت چندین سرور و اعمال پیکربندی روی سیستم‌ها و خیلی کارهای دیگه از ابزار Puppet استفاده کنین. 

در واقع Puppet یکی از برنامه‌های عالی DevOps هست برای مدیریت پیکربندی چندین سرور و استقرار برنامه‌ها.
تا قبل از اون مدیران سیستم، از اسکریپت‌های shell برای اجرای سرورها شون استفاده می‌کردن، البته هنوز هم استفاده می‌کنن. اما استفاده از این روش مقیاس‌پذیر بودن رو فراهم نمی‌کنه. 

حتی بهترین مدیر سیستم هم اون‌ قدر زمان نداره که بخواد به طور مداوم اسکریپت‌ها رو برای صدها یا هزاران سرور در حال تغییر، تغییر بده.  

برنامه‌های DevOps می‌تونن با تنظیم خودکار سرور، نصب برنامه و مدیریت سیستم، این مشکل رو برطرف کنن. یکی از مهم‌ترین این برنامه‌ها، Puppet است.
براساس نظرسنجی RightScale درباره‌ی بهترین‌های DevOps در سال ۲۰۱۶، Puppet به همراه Chef، جزو محبوب‌ترین برنامه‌ها بودند. 

مشابه سایر برنامه‌های Puppet ،DevOps به خودکارسازی تغییرات کمک می‌کنه و در واقع تغییرات دستی وابسته به اسکریپت رو از بین می‌بره. 

با این حال، Puppet به سادگی زبان‌های shell دیگه نیست، مثل PowerShell ویندوز یا Unix و Bash shell های لینوکس. 

علاوه بر این، جامعه‌ی کاربری Puppet، مخصوصاً در مقایسه با Chef و Ansible رشد زیادی نکرده. 

برای استفاده در سیستم‌های Bare-Metal و برای ارائه‌ی خدمات از راه دور و اجرای پیکربندی لازم، عالی عمل می‌کنه، اما برای مدیریت پیکربندی برنامه‌های تحت وب، پشتیبانی کافی رو ارائه نمی‌ده.

. . .

ابزار استقرار ۲۰۲۰: Terraform

Terraform ابزار متن‌باز "Infrastructure as Code" است و توسط شرکت HashiCorp ایجاد شده.

Terraform به عنوان ابزار کدنویسی declarative، به توسعه‌دهنده‌ها کمک می‌کنه تا از یک زبان پیکربندی سطح بالا به نام HCL (زبان پیکربندی HashiCorp)، استفاده کنن تا بتونن برای اجرای برنامه، زیرساخت‌های داخلی مورد نظر شون رو توصیف کنن.  

از اون‌جایی که Terraform از یک syntax ساده استفاده می‌کنه، می‌تونه برای چندین مرکز داده‌ی داخلی و ابری، زیرساخت‌های لازم رو تامین کنه. 

و علاوه بر این، می‌تونه با اطمینان و کارایی، مجددا زیرساخت لازم رو در پاسخ به تغییرات پیکربندی، تامین کنه و در حال حاضر یکی از محبوب‌ترین ابزارهای خودکارسازی زیرساخت، محسوب می‌شه. 

اگر سازمان شما قصد داره یک محیط ابر hybrid یا چند ابری رو ایجاد کنه، شما احتمالاً نیاز دارین که ازTerraform استفاده کنین. 

Terraform از زمان انتشار اولیه تا الان، مسیری طولانی رو طی کرده و پلاگین‌های زیاد و جامعه‌ی پشتیبانی وسیعی رو ارائه می‌ده که تقریبا در هر نوع سناریوی استقراری که مد نظر شما باشه، می‌تونه بهتون کمک کنه. 

مزیت‌های اصلی 

چند دلیل مهم وجود داره که توسعه‌دهنده‌ها به جای استفاده از سایر ابزارهای زیرساخت به عنوان کد، Terraform رو انتخاب می‌کنن:

  • متن‌باز بودن

 Terraform توسط انجمن‌های بزرگی از مشارکت‌کننده‌ها، که پلاگین‌هایی رو برای پلتفرم‌ها ایجاد می‌کنن، پشتیبانی می‌شه.

 صرف‌نظر از این‌که از کدوم ارائه‌دهنده‌ی ابر استفاده می‌کنین، پیدا کردن پلاگین‌ها و extension ها راحته و پشتیبانی حرفه‌ای هم به کاربر ارائه می‌شه.

 Terraform به سرعت داره تکامل پیدا می‌کنه، و به طور مرتب مزیت‌ها و پیشرفت‌های جدید، بهش اضافه می‌شه. 

  • Platform agnostic بودن

یعنی شما می‌تونین از Terraform، در هر سرویس ارائه‌دهنده‌ی خدمات ابری، استفاده کنین. بیش‌تر ابزارهای Infrastructure as Code دیگه طوری طراحی شدن که فقط می‌تونین با یک نوع ارائه‌دهنده‌ی خدمات ابری کار کنین. 

  • زیرساخت غیرقابل تغییر

 بیش‌تر ابزارهای Infrastructure as Code، زیرساخت‌های قابل تغییر رو ایجاد می‌کنن، یعنی زیرساخت می‌تونه تغییر کنه تا تغییراتی مثل به‌روزرسانی میان‌افزار یا سرور ذخیره‌سازی جدید رو در خودش جای بده.

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

Terraform، زیرساخت‌های تغییرناپذیر رو فراهم می‌کنه؛ یعنی با هر تغییر در محیط، پیکربندی فعلی با یک پیکربندی جدید، جایگزین می‌شه و زیرساخت‌ها از نو ساخته می‌شن. 

حتی می‌شه ورژن پیکربندی‌های قبلی رو هم حفظ کرد تا در صورت لزوم، بتونین به اون حالت‌ها برگردین.

ابزار مناسب برای پیروزی در رقابت

ابزار دیگه‌ای هم وجود داره که توی این دسته محبوبه به نام AWS CloudFormation که در ادامه باهاش بیش‌تر آشنا می‌شین.

  • AWS CloudFormation 

AWS CloudFormation سرویسی هست که به شما کمک می‌کنه منابع Amazon Web Services خودتون رو مدل‌سازی و تنظیم کنین تا بتونین زمان کم‌تری رو برای مدیریت این منابع صرف کنین و در عوض زمان بیش‌تری رو صرف تمرکز روی برنامه‌هایی کنین که در AWS اجرا می‌شن. 

شما الگویی ایجاد می‌کنین که تمام منابع AWS مورد نظرتون رو توصیف می‌کنه (مثل نمونه‌های Amazon EC2 یا نمونه‌های Amazon RDS DB). و AWS CloudFormation هم این منابع رو براتون تامین می‌کنه و این پیکربندی‌ها رو مدیریت می‌کنه.

نیازی به ایجاد و پیکربندی جداگانه برای منابع AWS ندارین و نیازی نیست بدونین چه چیزی، به چه چیزی، وابسته است. 

AWS CloudFormation همه‌ی این‌ها رو کنترل می‌کنه. 

اما نکته‌ای که وجود داره اینه که حتی اگه فقط توی یک فضای ابری AWS کار کنین، ممکنه در حرفه‌تون لازم باشه از سایر محیط ها هم استفاده کنین. 

این که خودتونو یه یک پلتفرم خاص محدود کنین، می‌تونه خطرناک باشه.

علاوه بر این، خیلی از سرویس‌های جدید AWS، قبل از این‌که در CloudFormation در دسترس باشن، به صورت ماژول Terraform در دسترس شما قرار می‌گیرن. 

بنابراین با استفاده از Terraform می‌تونین در هر نوع محیط مختلف مثل محیط های ابری و ...، کار کنین.  

جمع‌بندی

تو این پست با ابزارهای مختلف استقرار برنامه‌ها در DevOps آشنا شدین. 

برای آشنایی بیش‌تر با سایر ابزارهای حوزه‌ی DevOps، می‌تونین این پست‌ سکو رو هم بررسی کنین.