เปิด Vagrant Environment บนเครื่องตัวเองแบบสาธารณะ

บทความนี้จะมาแนะนำความสามารถหนึ่งของ Vagrant (อ่านว่า เว’-เกรินทฺ) ซึ่งเป็นเครื่องมือที่สามารถควบคุม virtual machine ผ่าน command line ได้ ความสามารถนั้นคือ “Share”

หมายเหตุ ความสามารถนี้ถูกใส่เข้ามาใน Vagrant เวอร์ชั่น 1.5 นะครับ ใครที่ใช้เวอร์ชั่นต่ำกว่านี้ก็..​ อัพเกรดเถอะ 🙂

ขอเกริ่น.. ในการพัฒนาซอฟต์แวร์บางครั้งอาจจะมีข้อจำกัดบางอย่าง เช่น เราเขียนโค้ดบนเครื่องของเรา แล้วเราก็อยากแชร์ให้เพื่อนในทีมเราเข้ามาดู หรือว่าพัฒนาเว็บ prototype ขึ้นมา แล้วอยากลูกค้าของเราดูก่อน ลองเล่นก่อน วิธีแก้ปัญหาส่วนใหญ่ก็คือเราต้องแบกเครื่องไปหาเพื่อน หรือว่าแบกไปหาลูกค้าเอง ในหลายๆ ครั้งก็อาจจะไม่ประสบความสำเร็จเท่าไหร่เนื่องด้วยเวลาจำกัดหรืออะไรก็แล้วแต่ ยิ่งถ้าลูกค้าอยู่ต่างประเทศด้วยยิ่งลำบาก ถามว่าทำไมไม่ push เข้า GitHub แล้วดีพลอยไว้บน server สักตัวหนึ่ง? ทำแบบนั้นก็ได้ครับ 😀 ผมแค่อยากมาเสนอทางเลือกอีกทางที่ง่ายกว่า เร็วกว่า และประหยัดเงินกว่าแน่นอนครับ

ก่อนอื่นต้องมี account ของ HashiCorp’s Atlas ก่อนนะครับ ถึงจะใช้ความสามารถนี้ได้ไปสมัครกันก่อนนะครับ ซึ่งวิธีใช้ง่ายมากครับสั่งคำสั่งตามนี้เลย

  1. vagrant login
  2. vagrant share

จบ! ผลที่ได้จะออกมาตามนี้ครับ

➜ hello-vagrant-share vagrant share
==> default: Detecting network information for machine...
default: Local machine address: 192.168.12.34
default: Local HTTP port: 80
default: Local HTTPS port: disabled
==> default: Checking authentication and authorization...
You must logged in to Vagrant Cloud in order to use `vagrant share`.
Please log in with `vagrant login`.

➜ hello-vagrant-share vagrant login
In a moment we will ask for your username and password to HashiCorp's
Atlas. After authenticating, we will store an access token locally on
disk. Your login details will be transmitted over a secure connection, and
are never stored on disk locally.

If you do not have an Atlas account, sign up at
https://atlas.hashicorp.com.

Atlas Username: zkan
Password (will be hidden):
You are now logged in.

➜ hello-vagrant-share vagrant share
==> default: Detecting network information for machine...
default: Local machine address: 192.168.12.34
default: Local HTTP port: 80
default: Local HTTPS port: disabled
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
default: Share will be at: brilliant-puppy-7314
==> default: Your Vagrant Share is running! Name: brilliant-puppy-7314
==> default: URL: http://brilliant-puppy-7314.vagrantshare.com
...

ถ้าผมสั่ง vagrant share เลย ก็จะโดนด่าว่าคุณต้อง login ก่อนนะ พอสั่งคำสั่งเสร็จจะเห็นได้ว่าตอนท้ายจะมี Name กับ URL โผล่ออกมาแบบนี้

default: Share will be at: brilliant-puppy-7314
==> default: Your Vagrant Share is running! Name: brilliant-puppy-7314
==> default: URL: http://brilliant-puppy-7314.vagrantshare.com

นั่นแหละครับ เอา Name หรือ URL นั้นไปให้เพื่อนหรือว่าให้ลูกค้าได้เลย ในที่นี้เครื่อง virtual machine ของผมติดตั้ง Nginx ไว้ ดังนั้นเวลาที่ผมเข้า URL นั้น ผมก็จะเห็นตามนี้ (เข้าผ่านมือถือแล้วก็ต่อเนทมือถือ)

Access Vagrant via Mobile

เข้า Vagrant ผ่านมือถือ

ชื่อของ Vagrant Share ที่ได้มาอย่าง brilliant-puppy-7314 จะเปลี่ยนไปเรื่อยๆ นะครับ เป็น ID ที่ต้อง unique

Vagrant Share นั้นมีอยู่ 3 แบบ แต่ทั้ง 3 แบบก็ไม่ได้แบ่งแยกขาดออกจากกันนะครับ การแชร์ทั้ง 3 แบบนี้จะมีส่วนทับซ้อนกันอยู่ ขึ้นอยู่กับว่าเราจะใส่ตัวเลือกว่าเราอยากแชร์แบบไหน

  1. แบบ HTTP ซึ่งแบบนี้จะเสมือนว่า Vagrant ของเราเป็น web server ไปเลย ไม่ว่าใครก็สามารถเข้ามาดูได้ถ้ารู้ URL เราสามารถแชร์แบบ https ได้ด้วยนะ ใช้คำสั่ง vagrant share ตามข้างต้นเลย
  2. แบบ SSH แบบนี้จะเปิดพอร์ต SSH ให้เพื่อนในทีม หรือใครก็ตามที่เราอยากให้เข้ามาในเครื่องเราได้ ซึ่งแบบนี้จะค่อนข้างปลอดภัยอยู่ ให้เราใส่คำสั่งเสริม –ssh เข้าไป (dash dash ssh) ดังนี้ vagrant share –ssh
    สำหรับเพื่อนร่วมทีมที่อยากเข้าเครื่องเรามาเค้าก็แค่สั่ง vagrant connect –ssh [vagrant share name]
  3. แบบเปิดให้ใครก็ได้เข้ามา พอร์ตไหนก็ได้..​ ค่อนข้างอันตรายนะครับ LOL ให้ระวังไว้หน่อยเวลาใช้ ซึ่งปกติวิธีนี้เวลาที่สั่ง vagrant share เราจะใส่คำสั่งเสริม –disable-http เข้าไปด้วยครับ และถ้าเราอยากให้คนเข้าเครื่องเรามาก็ให้เค้าใช้คำสั่ง vagrant connect [vagrant share name]

หมายเหตุ เวลาสั่ง vagrant share แบบไม่มีคำสั่งเสริม จะเป็นการเปิดแบบให้ใครเข้ามาก็ได้นะครับโดยค่าตั้งต้นของมัน แล้วก็แบบ 1 กับแบบ 3 จะดูค่อนข้างคล้ายกันนะครับ สำหรับผมแล้วผมแนะนำให้ดูที่จุดประสงค์ของการแชร์แล้วจะแยกการแชร์แต่ละแบบออกจากกันได้ชัดเจนมากขึ้น แล้วก็ทั้งนี้ทั้งนั้นถ้ามีเรื่องความปลอดภัยเข้ามาเอี่ยว สุดท้ายเราต้องกำหนด access เองภายในตัว virtual machine ของเราเองนะครับ

จริงๆ การที่เราทำแบบมียังมีข้อดีอีกหลายอย่างนะครับ เช่นว่า เราสามารถทำ pair programming กับเพื่อนที่ทำงานอยู่ต่างสถานที่กันได้ หรือว่าอีกอย่างหนึ่งคนเราสามารถทดสอบ webhook จากเว็บนอกได้ ซึ่งเป็นความสามารถที่ดีโคตรๆ ครับ ลองใช้กันดู!

ใครที่อยากรู้ว่ามันทำงานอย่างไร ตามไปอ่าน Feature Preview: Vagrant Share เลยครับ