Vagrant - מכונות מפתחים מהעתיד - מדריך הכרות עברי

Alonisser ,07/07/2013

מדריך שנכתב תוך כדי תנועה, תוך כדי ההכרות שאני עושה עם Vagrant.

מה זה בכלל Vagrant

אפשר להסתכל על Vagrant רק כעוד הפשטה של התקנת מכונה וירטואלית ללא ממשק המשתמש הגרפי. כותבים פקודה פשוטה בטרמינל והופ. יש לנו מכונה וירטואלית (כאמור, Headless) שאפשר לעשות אליה וממנה ssh, port forwarding וכו'. אבל בעצם מדובר על משהו שימושי ומתקדם יותר. Vagrant משלבת בהקמת המכונה הוירטואלית כלי הקמה (provisioning) מתקדמים: מShell scripts לאלתור מהיר ועד הסטנדרט בתעשייה של Puppet וChef. כך שאנחנו יכולים בקלות להקים את המכונה הוירטואלית עם כל התוכנות שאנחנו רוצים שהיא תריץ - בפקודה אחת! וכמובן לשכפל אותה בין המפתחים השונים בצוות. בעצם מדובר בכלי לניהול Dependencies וקונפיגורציה ברמת מערכת ההפעלה עצמה. כלי שמתמודד עם בעיית "אני לא מבין מה הבעיה, במכונה שלי זה פעל מעולה".
vagrantup

עוד שימוש אפשרי לVagrant הוא בדיקה של תסריטי Provisioning שונים. כיוון שאותה מכונה יכולה להיות מוקמת גם בAmazon וגם על המחשב שלי אנחנו יכולים לדייק את סקריפט ההקמה בפשטות של פיתוח מקומי (וללא העלות הנוספת של אחזקת שרתי הניסוי) ורק אח"כ להשתמש בסקריפט להקים את השרתים המבוקשים. הי, יש אפילו plugin לVagrant שמאפשר להקים שרת ישירות באמזון כולל ssh, תיקיות משותפות (Via Rsync) וכו'.

בעצם Vagrant הוא חלק מהתפישה החדישה של "תשתית כקוד" (Infrastructure as code) של ניהול התשתית וההקמה לתשתית ע"י מערכות קוד (ושמירת קוד - כמו Git) בדיוק כמו התוכנות שרצות עליהם.

התקנה

נתחיל מ התקנת מארח המכונות הוירטואליות Vagrant יודע לעבוד עם כמה סוגים של מכונות וירטואליות. אבל הכי פשוטה (וחינמית) היא כנראה VirtualBox מבית Oracle. אז נוריד ונתקין Virtualbox על המכונה שלנו. שימו לב יש באג מוזר ולא פתור בין הגרסה האחרונה של Vagrant לגרסה האחרונה של Virtualbox ולכן צריך להתקין (כרגע, מניח שבעתיד זה יפתר) את הגרסה האחרונה העובדת של Virtualbox: 4.2.10. אין צורך להתחיל את המכונה הוירטואלית אחרי ההתקנה.

השלב הבא הוא התקנת Vagrant, תורידו את הגרסה האחרונה שמתאימה למערכת ההפעלה שלכם (לינוקס, מק, חלונות), נכון לכתיבת שורות אלו מדובר בגרסה 1.2.2 ותתקינו. ההתקנה אוטומטית ברובה ולא דורש התאמצויות מיוחדות, בחלונות כן נדרש Restart אחרי ההתקנה. בודקים שהכל עובד בשלב זה. פשוט בלפתוח את הטרמינל שלנו (שורת הפקודה) ולכתוב: $vagrant --version ונקבל:
Vagrant version 1.2.2 (או גרסה אחרת)

הקמת מכונה וירטואלית

בשפה של Vagrant, התבניות להקמת מכונה וירטואלית נקראות קופסאות: Box. יש המוני Box מוכנות שבאות מהקופסה. ויש חברות או אתרים שמספקים כאלו באינטרנט (וגם אתם יכולים, אבל זה נושא מתקדם יותר מהמדריך הזה) עם פרה קונפיגורציה מסויימת. למשל האתר Getting started with Django מספק VM ארוז כזה לVagrant שמקים סביבת פיתוח לינוקסית מתאימה לDjango. אפשר להוריד מראש Box למחשב שלנו עם הפקודה vagrant box add ואפשר גם לטעון אותה כחלק מההקמה. כמו שנעשה במדריך הזה (וכמו שעושים במדריך של Vagrant)

אז איך מתחילים?

$mkdir myfirst_vagrant (או כל שם אחר) $cd myfirstvagrant
$agrant init precise32 http://files.vagrantup.com/precise32.box

או פירוש: אתחל אינסטנס חדש של vagrant והתקן אותו עם קופסה בשם precise32 שתוריד מהקישור הזה. במקרה שלנו קופסה ארוזה מראש של precise pangolin. גרסת אובונטו עדכנית יחסית. אבל יש עוד הרבה אפשרויות

ותקבלו: A `Vagrantfile` has been placed in this directory.
You are now ready to `vagrant up` your first virtual environment!
Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.

אם תעיינו עכשיו בתיקייה תוכלו לראות שנוצרה שם Vagrantfile.

ה Vagrantfile

נפתח עם העורך את הVagrantfile ונעיין בה. הVagrantfile היא המקום שנשמרת בו הקונפיגורציה שלנו. היא נוצרת עם פקודת vagrant init (ועם נוסיף משתנים מסויימים לפקודה היא גם תטען אותם ישירות לתוכנית) אפשר לראות שכיוון שטענו ישירות Box בפקודת הInit יש אליה כבר התייחסות בvagrantfile. אפשר גם לראות שיש שם מקום לטפל בport forwarding ובתסריטי ההקמה (provisioning) ולמיקום התיקיות המשותפות בין הVM למחשב הפיתוח שלכם (כן, ברור שיש כאלו, ומומלץ להשתמש בהם אלא אם אתם רוצים לערוך בNano את התוכניות שלכם, או משהו בסגנון. כרגע לא נתעסק עם זה ונעשה:

 vagrant up 

עכשיו המחשב יטחן קצת, עד עכשיו המכונה הוירטואלית עוד לא הורדה מהרשת וכעת היא יורדת מהרשת, מורצת ומותקנת על בסיס המארח הוירטואלי (virtualbox במקרה של המדריך הזה) שזה הסתיים בהצלחה תוכלו לכתוב:

 vagrant ssh 

. אגב, אם כבר הורדתם קופסה בשם הזה אזי היא לא תרד שוב אלא ההתקנה תהיה מזו הקיימת. אכסון הקופסאות הוא (ככל שהצלחתי לפענח מהניסוי שלי) גלובלי. כך שאם אתם יודעים שיש באותו קישור גרסה מעודכנת יותר של קופסה שאתם רוצים להוריד, תדאגו לשנות את השם שהיא תשמר, אחרת Vagrant תשתמש בעותק המקורי שהורדתם.

הסתיימה ההורדה וההתקנה והופ, נכנסתם לטרמינל של המכונה הוירטואלית שהותקנה. פשוט לא? כדאי לשים לב שעצם היציאה עם exit מהטרמינל יוצא מהמכונה הוירטואלית אבל היא ממשיכה לרוץ ברקע. פקודות נוספות יכולות לטפל במצבים שונים של כיבוי, הקפאה והשמדה של המכונה (vagrant halt, vagrant suspend, vagrant destroy) שתוכלו לקרוא עליהם בתיעוד.

טיפ קטן מההתנסות שלי עולה שכדאי להקפיא ו/או לסגור את המכונה עם הפקודה המתאימה שאנחנו מסיימים לעבוד בה, זה גם מוריד את העומס על הזכרון של התחנה המארחת וגם vagrant מתקשה להתמודד עם פעולות מסויימות של המערכת המארחת (כמו שינה או היברנציה של מערכת ההפעלה המארחת בחלונות לדוגמא).

ממשק שורת הפקודה

זו אולי הזדמנות להתעכב רגע על ממשק שורת הפקודה של vagrant.

עוד לא סיימנו

אנחנו יכולים להכנס לתחנה, אבל חסרות לנו שתי פונקציונאליות בסיסיות לעבודה עם המכונה הוירטואלית הזו: שיתוף קבצים בין המחשב המארח לתחנה הוירטואלית (כך למשל שנוכל להשתמש בIDE מתקדם על קבצים במחשב הוירטואלי, או שהקבצים של הפרוייקט שדורש את המכונה הוירטואלית יהיו באותה מערכת ניהול גרסאות) והפניית פורטים שנוכל לראות בדפדפן שלנו (במחשב המארח) מה עושה אפליקציית הרשת (אם זה מה שאנחנו עושים) בתחנה הוירטואלית.
את ההגדרות האלו נעשה בvagrantfile שלנו.

הפניית פורטים (ישירות מהתיעוד הרשמי)

תמצאו את השורה עם network:forwarded_port ותתקנו בהתאם למה שאתם רוצים (וכמובן תורידו את הcomment מתחילת השורה).
Vagrant.configure("2") do |config| # other config here
config.vm.network :forwarded_port, guest: 80, host: 8080

שיתוף תיקיות

ברירת המחדל של vagrant היא להגדיר את תיקיית הroot של הפרוייקט במחשב המארח כתיקייה משותפת, במקרה של הדוגמא שלנו מדובר על תיקיית: myfirst_vagrant במחשב המארח שתמופה ל /vagrant במחשב הוירטואלי. סביר שנרצה לעשות משהו חכם יותר עם ההגדרה הזו ואז (שוב תחת אותה שורת כותרת כמו בדוגמא הקודמת) נעשה uncomment לשורה הזו ונתקן אותה בהתאם:

config.vm.synced_folder "../data", "/vagrant_data"

לא לשכוח להוריד את הקומנט מתחילת שורת ההגדרה הקודמת

שהפרמטר הראשון הוא התיקייה על המחשב המארח והשני איפה יופיע במחשב הוירטואלי

תסריטי הקמה

תכלס, זו עיקר החגיגה נכון? הסיבה שאנחונ משתמשים בתוכנה הזו. vagrant מגיע מהבית עם תמיכה ב4 אפשרויות מרכזיות לתסריטי הקמה: Shell - כלומר קובץ bash להרצה כלשהו. ansible (שלא שמעתי עליה עד היום) וכמובן Puppet וChef. שניהם גם בפורמט הstandalone וגם תחת שרת אב.

עולם תסריטי ההקמה חורג ממגבלות המדריך הזה (ונקדיש לPuppet את אחד הפוסטים הבאים) אבל כמו שאתם יכולים לנחש הוא נשלט מהvagrantfile. הנה דוגמא מהתיעוד לקריאה לShell script חיצוני מתוך הvagrantfile:
config.vm.provision :shell, :path => "script.sh"

והנה מדריך נחמד לvagrant עם puppet (סדרה בעצם) לגבי האחרים, מוזמנים לתיעוד.

מתקדמים

כמובן שלא סיימנו בזה: אפשר לבנות box יעודי, אפשר לשלוט בvirtualbox ובאפשרויות שלה בצורה יותר מדוייקת ואפילו להציג את הgui של מערכת ההפעלה הוירטואלית. אפשר לקנפג הגדרות רשת מתקדמות (כך למשל שהמחשב הוירטואלי יופיע ברשת המקומית) ועוד ועוד.

אז יש עוד הרבה vagrant ורצוי להתקדם לתיעוד הרשמי שלהם. או ללמוד יותר על כלי הprovisioning כמו Puppet או chef.

יש גם כלים שמקצרים חלק מהעובדה עם Vagrant כמו Rovi.io אתר שמאפשר להוריד קונפיגורציות chef/vagrant מוכנות לתסריטים פופולריים (כרגע רק Lamp וRails) או לבנות כזה בממשק וובי נוח בלי להכיר פקודות chef. מניח שבקרוב (אולי כפפה שמישהו כאן רוצה להרים?) ישולבו גם כלי תסריטי הקמה נוספים כמו Salt.

טיפים לפתרון בעיות

  • לפעמים vagrant תתקע בהעלאת המכונה (ראו הערה קודמת על חלונות כמערכת מארחת שעוברת למצב שינה) - נכון שאפשר תמיד לעשות Destroy למכונה ולהקים מחדש אבל לא תמיד נרצה לעשות את זה (בפרט אם היתה לנו קונפיגורציה שבוצע "בטעות" שלא דרך הVagrantfile. דרך לדבג את הבעיה יכולה להיות לעשות Uncomment לשורות שמגדירות את vb.gui ואז המכונה הוירטואלית תפתחת עם ממשק המשתמש שלה, לפעמים נוכל לראות שם מה תוקע את המערכת ומה צריך לתקן. יש עוד פתרונות לבעיות נפוצות בwiki של vagrant .ב Github.

שיהיה בהצלחה!

Tags:

2 תגובות

  1. אחת הכתובות הכי נכונות שקראתי בחיים שלי.

    (שנה רק את ה2011 בזכויות יוצרים למטה ) :-)

    ממליץ בחום על puphpet.com

    נ"ב

    הזוי לי שאני הראשון שמגיב כאן אבל בישראל כמו בישראל הvagrant יגיע רק ב2016 …

    • מאת Alonisser:

      לא הכרתי את puphpet.com
      מגניב ממש

      בינתיים אני כבר חי עם ואגרנט במיליון שימושים נוספים
      באמת בתקווה שיהיה נפוץ יותר בישראל

תגובה