Error
  • JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING
  • JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING
  • JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING
  • JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_media, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1
  • Error loading component: com_content, 1

کاربران توزیع‌های دسکتاپی لینوکس، با APT آشنایی دارند. این نرم‌افزار که وظیفه مهمی را به‌دوش کشیده است، بسادگی می‌تواند نصب، پیکربندی و راه‌اندازی پشته‌های پیچیده‌ای از نرم‌افزارها و سرویس‌ها را انجام دهد، اما محدودیت APT این است که تمام این کارهای فوق‌العاده را تنها در یک سیستم انجام می‌دهد. Juju این قابلیت را گسترش می‌دهد و می‌تواند در چند ماشین نیز چنین کارهایی را انجام دهد.

اغلب اوقات سرورهای لینوکسی برای کارهای مشابهی راه‌اندازی می‌شوند. چند ماشین فیزیکی می‌توانند پیکربندی مشابهی داشته باشند تا بتوانند با یکدیگر درون شبکه کار کنند. مثلا برای توزیع میزان بار سرور یا جلوگیری از زمان قطعی (Downtime) در زمانی که یکی از سرورها قطع می‌شود یا بار روی آن زیاد است از چند سرور با تنظیمات مشابه استفاده می‌کنند. مدیران سیستم هم در ایجاد و رهبری چنین شبکه‌هایی استادند. هر چند انجام این کارها به شیوه سنتی نیازمند این است که تک‌تک ماشین‌ها را جدا از هم پیکربندی کرد و...

 

سال‌ها برای ساده‌کردن چنین وظیفه‌ای، ابزارهای مختلفی تولید شده است که از میان آنها می‌توان به‌ Chef و Puppet اشاره کرد. شیوه کارکرد Juju در سرورها، درست مانند پکیج منیجرها در سیستم‌های تکی است. این ابزار برای نصب، راه‌اندازی و مدیریت بسته‌ها در چند سیستم استفاده می‌شود و روند پیکربندی را ساده می‌کند و بخصوص طوری طراحی شده است که از رایانش ابری بهتر استفاده کند.

درست همانند دستور پخت در Chef یا مانیفست در Puppet، این سرویس نیز از فرمول‌هایی برای نوشتن وظیفه‌های مختلف استفاده می‌کند که می‌تواند در اختیار دیگران نیز قرار داده شود تا آنها نیز روی سرور‌های خود از این سرویس‌ استفاده کنند. چیزی که Juju را با دیگران متمایز می‌کند، همین فرمول‌هاست که Charm نامیده می‌شود. سرویس‌های ایزوله‌ای تمام روش‌های لازم برای نصب یا پیکربندی داده‌ها را در خود قرار می‌دهد. از چارم‌های Juju می‌توان به‌روش‌های مختلفی استفاده کرد. از نوشتن اسکریپت‌های شل گرفته تا اجرای Chef به‌عنوان مسئول انجام دهنده وظایف سیستمی. همچنین بهتر است اشاره شود که Juju می‌تواند منابع خود را مدیریت کند. این منابع می‌تواند EC2، Eucalyptus یا OpenStack باشد.

شروع به‌کار

نصب Juju در سرور ساده است و فقط باید دستور زیر را اجرا کنیم:‌

 

sudo apt‌ـ‌get install juju

سپس باید به سیستم بگوییم از منبع Cloud (وب‌سرویس‌های آمازون، EC2 و...) استفاده کند یا از محیط محلی (برای تست و توسعه). دستوری که برای bootstrap استفاده می‌کنیم، برای هر سیستم متفاوت خواهد بود، اما دستور اولیه آن به‌صورت زیر است:

 

juju bootstrap

 

نخستین باری که این دستور اجرا می‌شود، فایلی را در مسیر زیر قرار می‌دهد که محتوای آن در ادامه آمده است:

 

~‌/‌.juju‌/‌environments‌/‌yaml

 

در این فایل نمونه، اگر از سرویس‌های وب‌ آمازون استفاده می‌کنید، باید خطوط مربوط به آن را در این فایل قرار دهید تا Juju بتواند به حساب AWS دسترسی پیدا کند. افرادی که درگیر با تنظیمات سرور هستند بخوبی با این نوع فایل‌ها آشنایی دارند، به همین دلیل از این مرحله عبور می‌کنیم. انجام bootstrap چند دقیقه وقت می‌گیرد، اگر می‌خواهید اوضاع را بررسی کنید، دستور زیر را بزنید:

 

juju status

 

وقتی status به حالت up and running رسید، ایده خوبی است که Session log را شروع کنیم. این کار الزامی نیست، اما حل مشکل را ساده‌تر می‌کند. از دستور زیر استفاده کنید:

 

juju debug‌ـ‌log

 

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

 

این کار را با کمک چارم انجام می‌دهیم که درحقیقت برای جزئیات نصب و راه‌اندازی سرویس‌های ‌خاص استفاده می‌شود. به دستورات زیر نگاه کنید:

 

juju deploy mysql

 

 

juju deploy wordpress

 

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

 

juju add‌ـ‌relation wordpress mysql

 

حالا اگر وضع خود را چک کنید، چیزی مشابه شکل زیر خواهید دید:‌

 

0:

 

agent‌ـ‌state: running

 

dns‌ـ‌name: localhost

 

instance‌ـ‌id: local

 

instance‌ـ‌state: running

 

services:

 

mysql:

 

charm: cs:precise‌/‌mysql‌ـ‌3

 

relations:

 

db:

 

‌ـ‌ wordpress

 

units:

 

mysql‌/‌0:

 

agent‌ـ‌state: started

 

machine: 2

 

public‌ـ‌address: 192.168.122.165

 

wordpress:

 

charm: cs:precise‌/‌wordpress‌ـ‌3

 

exposed: false

 

relations:

 

db:

 

‌ـ‌ mysql

 

units:

 

wordpress‌/‌0:

 

agent‌ـ‌state: started

 

machine: 1

 

public‌ـ‌address: 192.168.122.166

 

اکنون با استفاده از expose می‌توان سرویس را به وب وصل کرد تا خارج از محیط سرور بتوان به آن دست یافت:‌

 

juju expose wordpress

 

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

 

اکنون اگر بلاگ وردپرسی که داریم محبوب شد و سرور سنگین شد باید چه کار کنیم؟ در حالت سنتی، باید تنظیمات، دیتابیس و خود وردپرس را به سرورهای دیگر نیز ببریم و به‌صورت دستی تنظیمات را انجام دهیم. با کمک juju کافی است دستور زیر را بزنیم:

 

juju add‌ـ‌unit wordpress

 

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

 

چارم‌ها

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

هر چند اطلاعاتی که در ادامه می‌آید کمی پیچیده‌ به‌نظر می‌رسد (و پیچیده هم است)؛ اما با اندکی مطالعه، هر کسی که به‌اندازه کافی درباره سرویس مورد نظرش اطلاعات داشته باشد، می‌تواند یک چارم برای آن بنویسد.

مثلا در مورد MySQL و wordpress که از آن در مثال خود استفاده کردیم، فایل چارم به این صورت خواهد بود:

 

name: mysql

 

summary: "A pretty popular database"

 

maintainer: "Juju Charmers "

 

provides:

 

db: mysql

 

 

name: wordpress

 

summary: "A pretty popular blog engine"

 

maintainer: "Juju Charmers "

 

provides:

 

url:

 

interface: http

 

requires:

 

db:

 

interface: mysql

 

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

در حال حاضر، چارم‌های از پیش‌ آماده زیادی وجود دارد که می‌توان از Ubuntu Juju Charm Browser آنها را استخراج، مشاهده و استفاده کرد. با کمک این چارم‌ها می‌توان بسادگی دیتابیس Hadoop، مدیاویکی یا سرور Minecraft راه‌اندازی کرد. برای کسب اطلاع بیشتر می‌توانید به نشانی زیر مراجعه کنید تا از چم و خم امور مرتبط با چارم‌ها اطلاعات زیادی کسب کنید:

https:‌/‌‌/‌juju.ubuntu.com‌