O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
Vagrant教學
Vagrant教學
Carregando em…3
×

Confira estes a seguir

1 de 118 Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Quem viu também gostou (20)

Anúncio

Semelhante a A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩 (20)

Mais de Wen-Tien Chang (20)

Anúncio

A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩

  1. 1. a brief introduction to Vagrant 原來 Virtual Box 可以這樣玩 http://ihower.tw 2013/4/20@osdc.tw
  2. 2. 我是誰? • 張⽂文鈿 a.k.a. ihower • http://ihower.tw • http://twitter.com/ihower • Ruby Developer since 2006 • CTO, Faria Systems Ltd. • The organizer of RubyConf Taiwan • http://rubyconf.tw
  3. 3. We’re hiring Ruby on Rails developer
  4. 4. Agenda • Why? • What’s Vagrant • Features • Shared Folder • Networking • Provisioning • Pachaging • Multi-VM • More Providers • Conclusion
  5. 5. Why?
  6. 6. WebOps
  7. 7. WebOps • 如何⾃自動化安裝和設定伺服器?
  8. 8. WebOps • 如何⾃自動化安裝和設定伺服器? • 需要開機器進⾏行安裝測試
  9. 9. 缺點
  10. 10. 缺點 • 無論是實體機器或 VPS, AWS EC2
  11. 11. 缺點 • 無論是實體機器或 VPS, AWS EC2 • 緩慢的 Feedback loop
  12. 12. 缺點 • 無論是實體機器或 VPS, AWS EC2 • 緩慢的 Feedback loop • 環境弄髒了,重灌很慢
  13. 13. WebDev
  14. 14. WebDev • 如何設定開發環境?
  15. 15. WebDev • 如何設定開發環境? • 拿到⼀一個新專案,怎樣才能跑起來呢?
  16. 16. WebDev • 如何設定開發環境? • 拿到⼀一個新專案,怎樣才能跑起來呢? • 看 README
  17. 17. WebDev • 如何設定開發環境? • 拿到⼀一個新專案,怎樣才能跑起來呢? • 看 README • 有 setup script?
  18. 18. WebDev • 如何設定開發環境? • 拿到⼀一個新專案,怎樣才能跑起來呢? • 看 README • 有 setup script? • 不斷嘗試錯誤,找出 dependency
  19. 19. WebDev (cont.)
  20. 20. WebDev (cont.) • 這功能在我電腦上是正常的
  21. 21. WebDev (cont.) • 這功能在我電腦上是正常的 • 開發環境跟 Production 環境越接近,bug 就越少
  22. 22. 缺點
  23. 23. 缺點 • 不總是 works
  24. 24. 缺點 • 不總是 works • 不是⾃自動化
  25. 25. 缺點 • 不總是 works • 不是⾃自動化 • 無法驗證正確
  26. 26. 缺點 • 不總是 works • 不是⾃自動化 • 無法驗證正確 • 不是 Isolated,不同機器環境就不同
  27. 27. 缺點 • 不總是 works • 不是⾃自動化 • 無法驗證正確 • 不是 Isolated,不同機器環境就不同 • 也是很慢
  28. 28. Solution
  29. 29. Virtual Machine ⽼老梗: 虛擬化
  30. 30. VM Providers • Virtual Box • Vmware Fusion • Parallels • LXC • KVM • Cloud computing: • AWS EC2 • Rackspace Cloud
  31. 31. 使⽤用 VM 的好處
  32. 32. 使⽤用 VM 的好處 • Isolated
  33. 33. 使⽤用 VM 的好處 • Isolated • Repeatable
  34. 34. 使⽤用 VM 的好處 • Isolated • Repeatable • Local (i.e. Fast)
  35. 35. 使⽤用 VM 的好處 • Isolated • Repeatable • Local (i.e. Fast) • Host-OS agnostic
  36. 36. 使⽤用 VM 的好處 • Isolated • Repeatable • Local (i.e. Fast) • Host-OS agnostic • Anyone can do it (Faster on-boarding)
  37. 37. 使⽤用 VM 的好處 • Isolated • Repeatable • Local (i.e. Fast) • Host-OS agnostic • Anyone can do it (Faster on-boarding) • Less bugs
  38. 38. Vagrant http://www.vagrantup.com/
  39. 39. Vagrant • Vagrant uses VirtualBox to build configurable, lightweight, and portable virtual machines dynamically • Open Source: MIT license • It support more providers recently: • VMware Fusion • AWS EC2 • Rackspace
  40. 40. The creator • Mitchell Hashimoto • 從 2010 年開始 • 2012/11 成⽴立 Hashicorp 公司作商業⽀支 持,並提供更多(付費) Providers,包括 VMware Fusion, Workstation 和 vSphere 等 等。
  41. 41. Who use it? • Mozilla, Firefox • BBC News • New York Times • Openstack • NOKIA • Livingsocial • yammer • shopify • disqus • eventbrite • ngmoco
  42. 42. 安裝 Vagrant • 下載安裝 Virtualbox • 下載安裝 Vagrant • ⽀支援 Windows, Mac, Linux
  43. 43. Warning for Ruby developers • Vagrant 1.1+ 之後不⽤用 rubygems 安裝了 • 主要理由: For non-rubyist • http://mitchellh.com/abandoning-rubygems
  44. 44. 從現有的專案開 VM • git clone git://github.com/eduvo/pair_tdd_get_started.git • vagrant up • 可以開始寫 Ruby 了
  45. 45. Live Demo 請不要在會場做 第⼀一次跑需要下載 VM image, 306mb
  46. 46. 新開⼀一個 Ubuntu VM • vagrant box add precise64 http://files.vagrantup.com/precise64.box • mkdir my_box • cd my_box • vagrant init precise64 • vagrant up
  47. 47. Demo 真的,請不要在會場做 第⼀一次跑需要下載 VM image, 306mb
  48. 48. VM Lifecycle (基本指令) • vagrant up 開機 • vagrant ssh 登⼊入 • vagrant suspend 暫停 • vagrant halt 關機 • vagrant destroy 刪除
  49. 49. Vagrantfile • Vagrant 是 project-oriented • 每個專案都有 Vagrantfile 設定檔 • Ruby DSL 語法,不會 Ruby 也很簡單
  50. 50. 最基本的 Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "precise64" # 如果找不到上述的 box 檔案,從下列網址下載 config.vm.box_url = "http://files.vagrantup.com/precise64.box" end
  51. 51. Base Boxes • 開 VM 的基本 image • box 是⼀一個檔案 • Vagrant 是 project-oriented,在 project 裡 ⾯面玩,不影響 Box。 • 官⽅方有包 Ubuntu 10.04/12.04, 32bit/64bit for VirtualBox 的 boxes • 更多第三⽅方 http://vagrantbox.es
  52. 52. Box 指令 • vagrant box list 列出 • vagrant box add 新增 • vagrant box remove 刪除
  53. 53. 進階功能 • Shared Folder • Networking • Provisioning • Packaging • Multi-VM • More providers via plugins
  54. 54. Host OS v.s. Guest VM Host OS Guest VM Guest VM Guest VM
  55. 55. How to Work in a VM?
  56. 56. Shared folder config.vm.share_folder "foo", "/guest/path", "/host/path", :nfs => true
  57. 57. Shared folder config.vm.share_folder "foo", "/guest/path", "/host/path", :nfs => true • 在 host 和 guest 之間共享檔案
  58. 58. Shared folder config.vm.share_folder "foo", "/guest/path", "/host/path", :nfs => true • 在 host 和 guest 之間共享檔案 • 例如開發⽤用 Editor 在 host 跑,但是程式 是在 guest 裡執⾏行
  59. 59. Shared folder config.vm.share_folder "foo", "/guest/path", "/host/path", :nfs => true • 在 host 和 guest 之間共享檔案 • 例如開發⽤用 Editor 在 host 跑,但是程式 是在 guest 裡執⾏行 • 預設 guest 裡的 /vargant 就是專案⺫⽬目錄
  60. 60. Shared folder config.vm.share_folder "foo", "/guest/path", "/host/path", :nfs => true • 在 host 和 guest 之間共享檔案 • 例如開發⽤用 Editor 在 host 跑,但是程式 是在 guest 裡執⾏行 • 預設 guest 裡的 /vargant 就是專案⺫⽬目錄 • VirtualBox shared folder 效能差,Vagrant ⽀支援 NFS
  61. 61. Demo 在 Host OS 裡編輯,在 Guest VM 裡⾯面執⾏行
  62. 62. Networking 以下三種可以依照需求選擇使⽤用,都⽤用也可以 • Port forwarding • Host-only networking • Bridged Networding
  63. 63. Port forwarding config.vm.network :forwarded_port, guest: 80, host: 8080 • 設定 host 某個 port 對應到 guest 的某個 port • 例如 host 8080 對應到 guest 80 • 最簡單
  64. 64. Host-only networking config.vm.network :private_network, ip: "192.168.33.10" • 指定⼀一個 IP • Gust VMs 之間可以互通 • Local only,只有本機可以存取 • 最好⽤用,⼜又安全 • 缺點: 可能會跟外部 IP 撞到
  65. 65. Bridge Networking config.vm.network :public_network • 將 VM 橋接到 Host OS 上的網路 device • ⽤用 DHCP 拿⼀一個 IP • 優點: LAN 上的其他電腦也可以存取 • 缺點: 不總是 works,會依賴 Router,例 如飯店或 public wifi
  66. 66. Demo 在 Guest VM 裡開 Web Server 在 Host OS 外⽤用瀏覽器讀取
  67. 67. Provisioning
  68. 68. Server provisioning
  69. 69. Server provisioning • Server provisioning is a set of actions to prepare a server with appropriate systems, data and software, and make it ready for network operation. (from wikipedia)
  70. 70. Server provisioning • Server provisioning is a set of actions to prepare a server with appropriate systems, data and software, and make it ready for network operation. (from wikipedia) • 就是裝 server 啦
  71. 71. Old-school I’m System Administrator
  72. 72. Old-school I’m System Administrator • 寫⽂文件,照著作
  73. 73. Old-school I’m System Administrator • 寫⽂文件,照著作 • "multi-terminal",開⼀一個視窗打指令,同 時好幾個 servers 都會執⾏行
  74. 74. Old-school I’m System Administrator • 寫⽂文件,照著作 • "multi-terminal",開⼀一個視窗打指令,同 時好幾個 servers 都會執⾏行 • 建⽴立 .iso image 以便拷⾙貝新機器
  75. 75. Old-school I’m System Administrator • 寫⽂文件,照著作 • "multi-terminal",開⼀一個視窗打指令,同 時好幾個 servers 都會執⾏行 • 建⽴立 .iso image 以便拷⾙貝新機器 • 缺點:版本維護
  76. 76. Old-school (cont.)
  77. 77. Old-school (cont.) • 撰寫 setup shell script
  78. 78. Old-school (cont.) • 撰寫 setup shell script • 缺點: shell script 不聰明,不好維護
  79. 79. Old-school (cont.) • 撰寫 setup shell script • 缺點: shell script 不聰明,不好維護 • 再跑⼀一次會裝第⼆二次
  80. 80. Old-school (cont.) • 撰寫 setup shell script • 缺點: shell script 不聰明,不好維護 • 再跑⼀一次會裝第⼆二次 • 套件之間的 dependency 關係
  81. 81. Old-school (cont.) • 撰寫 setup shell script • 缺點: shell script 不聰明,不好維護 • 再跑⼀一次會裝第⼆二次 • 套件之間的 dependency 關係 • 套件的設定檔要如何管理?
  82. 82. Modern provisioning I’m DevOps
  83. 83. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools
  84. 84. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools • Chef
  85. 85. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools • Chef • Puppet
  86. 86. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools • Chef • Puppet • CFEngine
  87. 87. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools • Chef • Puppet • CFEngine • 撰寫 recipe (Chef) 或 manifest (Puppet) 設定要裝 什麼東⻄西
  88. 88. Modern provisioning I’m DevOps • 利⽤用 Configuration Management tools • Chef • Puppet • CFEngine • 撰寫 recipe (Chef) 或 manifest (Puppet) 設定要裝 什麼東⻄西 • receipt 和 manifests 可以重複執⾏行,保持 server 到最新版。不會發⽣生重裝第⼆二遍的情形。
  89. 89. Modern provisioning I’m DevOps
  90. 90. Modern provisioning I’m DevOps • 易於設定 dependencies
  91. 91. Modern provisioning I’m DevOps • 易於設定 dependencies • 易於除錯
  92. 92. Modern provisioning I’m DevOps • 易於設定 dependencies • 易於除錯 • 版本控制
  93. 93. Modern provisioning I’m DevOps • 易於設定 dependencies • 易於除錯 • 版本控制 • 社群及商業⽀支援,不需要全部⾃自⼰己寫
  94. 94. Vagrant ⽀支援 ⽅方便 DevOps 測試 Recipe • shell • Chef • Puppet • CFEngine
  95. 95. Vagrantfile Example config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "./cookbooks" chef.add_recipe "nginx" chef.json = { :nginx => { :worker_processes => "4" } } end
  96. 96. Chef Example package "nginx" service "nginx" do supports :status => true, :restart => true, :reload => true action [:enable, :start] end template "/etc/nginx/nginx.conf" do source "nginx.conf.erb" notifies :reload, "service[nginx]" end
  97. 97. Demo 修改 nginx template,再次 provision Server 就會套⽤用並重開 nginx
  98. 98. Packaging
  99. 99. 將⺫⽬目前的 VM 打包成 Box • vagrant package 產⽣生 package.box 檔案 • vagrant box add <name> package.box • 使⽤用時機 • Package up installed software • Use provisioners for configuration and managing services
  100. 100. Multi-VM
  101. 101. Multi-VM • 同⼀一個 Vagrantfile 可以設定多個 VM • vagrant up 就會同時開起來 • 適合 distributed 和 SOA 開發環境 • ⼀一台 Web server • 多台 Application servers • ⼀一台 Database server
  102. 102. Vagrantfile example 指定IP,VMs 之間也可以互通 Vagrant.configure("2") do |config| config.vm.define :web do |web| web.vm.box = "precise64" web.vm.network :private_network, :ip => "192.168.33.11" end config.vm.define :app do |app| app.vm.box = "precise64" app.vm.network :private_network, :ip => "192.168.33.12" end config.vm.define :db do |db| db.vm.box = "precise64" db.vm.network :private_network, :ip => "192.168.33.13" end end
  103. 103. Demo ⼀一次開三台 VMs!
  104. 104. More providers via plugins
  105. 105. VMware Fusion • 更快 • 更穩定 • 需付費購買
  106. 106. AWS • 同樣的 vagrant up 指令,可以開 VM 在 EC2 或 VPC 上 • 使⽤用情境: • 可以開運算能⼒力的 EC2 機器作開發或測試運算 • 可以開真正 production 使⽤用的機器作測試 • 從開發、staging 到 production,都⽤用 vagrant 開 VM 管理 • 無論 providers,Vagrantfile 皆共⽤用
  107. 107. Demo vagrant up --provider=vmware_fusion vagrant up --provider=aws
  108. 108. Conclusion 使⽤用情境
  109. 109. Conclusion 使⽤用情境 • DevOps 開發和測試 Chef/Puppet/etc. scripts
  110. 110. Conclusion 使⽤用情境 • DevOps 開發和測試 Chef/Puppet/etc. scripts • WebDev 可以使⽤用上述 DevOps 開發的 scripts 安裝出⾮非常接近 production 的開 發環境
  111. 111. Conclusion 使⽤用情境 • DevOps 開發和測試 Chef/Puppet/etc. scripts • WebDev 可以使⽤用上述 DevOps 開發的 scripts 安裝出⾮非常接近 production 的開 發環境 • QA 測試⼯工程師可以使⽤用 CI 搭配 Vagrant 來建構⾃自動化的部署測試、⼤大規模的 test environment 等等
  112. 112. Vagrant 讓整個 workflow 從 dev 到 production 變的⼀一致好⽤用
  113. 113. 謝謝! Thank you! (對 Vagrant 或 Chef 有問題歡迎來 Faria 攤位找我們的 DevOps: Vincent)
  114. 114. References • http://www.hashicorp.com/blog • http://net.tutsplus.com/tutorials/php/vagrant-what-why- and-how/ • O'Reilly Velocity 2012: Develop and Test Configuration Management Scripts with Vagrant • LARubyconf 2011: Working in Vurtual Machines-The Vagrant Way • ChefConf 2012: http://confreaks.com/videos/1672- chefconf2012-consistent-local-development-with-vagrant- and-chef

×