آشنایی با pyinfra؛ خودکارسازی زیرساخت با Python و SSH

چرا مهم است

اگر پیکربندی server را با Python می‌نویسی، pyinfra راهی برای اجرای آن از طریق SSH معرفی می‌کند. در کنار این امکان، باید محدودیت operation‌های آماده و نیاز به مراقبت در deployment هم‌زمان را هم در نظر بگیری.

قبل از خواندن، این‌ها را بدان۴ مفهوم
declarative

رویکردی که در آن وضعیت مطلوب توصیف می‌شود و ابزار تعیین می‌کند برای رسیدن به آن چه کاری لازم است.

بیشتر درباره این مفهوم

idempotent

ویژگی عملیاتی که تکرار آن پس از رسیدن به وضعیت مطلوب، تغییر تازه‌ای ایجاد نمی‌کند.

بیشتر درباره این مفهوم

virtual machine

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

بیشتر درباره این مفهوم

Type Checking

بررسی سازگاری type مقدارها و نحوهٔ استفاده از آن‌ها برای شناسایی خطاهای مرتبط با type.

بیشتر درباره این مفهوم

Adrian در متن ویرایش‌شدهٔ یک ارائه در دورهمی DevOps، ابزار pyinfra را معرفی می‌کند؛ ابزاری عمدتاً command-line که کد Python را به دستورهای shell تبدیل می‌کند و آن‌ها را از طریق SSH، به‌صورت موازی روی چند server اجرا می‌کند. سناریوی ارائه، deploy یک landing page و یک web app مبتنی بر Python است؛ ابتدا روی یک virtual machine محلی و سپس روی دو server جداگانه.

pyinfra مانند Ansible رویکرد declarative دارد: وضعیت مطلوب server توصیف می‌شود و ابزار آن را ایجاد می‌کند. همچنین idempotent است؛ یعنی اگر وضعیت موجود از قبل مطابق خواسته باشد، تغییری انجام نمی‌شود. تفاوت برجسته در این معرفی، نوشتن deployment با Python به‌جای YAML است. در نتیجه، استفاده از for، if، import، code completion و Type Checking در همین فایل‌ها ممکن است.

آموزش با دو مفهوم operation و fact پیش می‌رود. operation وضعیت server را تغییر می‌دهد و بیشتر operation‌ها declarative و idempotent هستند. fact اطلاعاتی دربارهٔ host مقصد جمع می‌کند تا تصمیم‌گیری دربارهٔ operation ممکن شود. برای نمونه، با خواندن نام توزیع Linux می‌توان مشخص کرد package مربوط به Apache باید با نام apache2 نصب شود یا httpd. فایل Python حاوی operation‌ها نیز در اصطلاح pyinfra یک deploy نام دارد.

در مثال ساخت فایل، pyinfra ابتدا نشان می‌دهد کدام operation روی کدام host تغییر ایجاد خواهد کرد و تأیید می‌خواهد. اجرای دوبارهٔ همان deploy، وقتی فایل موجود است، تغییری ایجاد نمی‌کند. نمونهٔ ساده‌شدهٔ پیاده‌سازی هم همین منطق را نشان می‌دهد: وضعیت فعلی با fact خوانده می‌شود، با وضعیت مطلوب مقایسه می‌شود و فقط در صورت تفاوت، دستور لازم تولید می‌شود. گزینهٔ --debug نیز دستورهای اجراشده در مرحله‌های مختلف را نمایش می‌دهد.

نویسنده pyinfra را برای پیکربندی server از طریق SSH، self-hosting و اجرای دستورهای ad-hoc روی مجموعه‌ای از server‌ها مناسب می‌داند. در عین حال، محدودیت‌ها را هم ذکر می‌کند: تعداد operation‌های آماده و ecosystem آن از Ansible کوچک‌تر است، pipeline کاملاً خودکار کار اضافه می‌خواهد و اجرای هم‌زمان deployment توسط چند نفر به مراقبت نیاز دارد. او به وجود Python API برای ساخت ابزار روی pyinfra نیز اشاره می‌کند.

نکته کلیدی

در pyinfra وضعیت مطلوب را توصیف کن، نه صرفاً مجموعه‌ای از دستورها را. تفاوت operation و fact را به خاطر بسپار: یکی تغییر را انجام می‌دهد و دیگری اطلاعات host را برای تصمیم‌گیری فراهم می‌کند.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)