Vagrant是一个强大的虚拟机工具,这里我们将看看如何在Ubuntu上设置和使用Virtualbox和Vagrant来提供可复制的虚拟机。虚拟机,并不复杂多年来开发人员一直在使用虚拟机作为他们工作流程的一部分,允许他们交换和改变他们的软件运行的环境,通常是为了防止项目之间的冲突,例如需要php5.3的项目A和项目B需要php5.4。使用虚拟机意味着您只需要您正在使用的计算机,而不是专用硬件来镜像您的生产环境。当多个开发人员在一个项目上工作时,它也很方便,他们都可以运行包含所有需求的单一环境,但是当Vagrant派上用场时,维护多台机器并确保所有需求具有相同的版本是非常困难的。使用虚拟机的好处你的虚拟机与宿主机环境是分开的你可以根据你的代码需求定制一个自定义的虚拟机而不影响其他虚拟机可以运行你宿主机上不能运行的程序,比如运行在Ubuntu中的一些软件只能在Windows上运行什么是Vagrant简而言之,这是一个与虚拟机一起工作并允许您自动创建和删除虚拟机的工具。它围绕一个名为VagrantFile的配置文件工作,该文件告诉Vagrant你想安装哪个操作系统,以及一些其他选项,如IP和目录同步。您还可以将命令添加到虚拟机上的配置脚本。通过共享这个VagrantFile,项目中的所有开发人员都可以使用完全相同的虚拟机。安装要求安装VirtualBoxVirtualBox是一个运行虚拟机的程序,可以从Ubuntu存储库安装。sudoapt-getinstallvirtualbox安装Vagrant对于Vagrant本身,您需要访问https://www.vagrantup.com/downloads.html查看适用于您的操作系统的安装包。安装增强功能如果您计划与虚拟机共享任何文件夹,则需要安装以下插件。vagrantplugininstallvagrant-vbguest配置Vagrant首先我们需要为Vagrant创建一个文件夹。mkdir~/Vagrant/test-vmcd~/Vagrant/test-vm创建VagrantFile:vagrantinit启动虚拟机:vagrantup登录机器:vagrant-ssh此时,你将拥有一个基本的vagrant机器,以及一个名为VagrantFile的文件。制定在上面的步骤中创建的VagrantFile看起来类似于以下内容VagrantFile:#-*-mode:ruby??-*-#vi:setft=ruby:#所有Vagrant配置都在下面完成。Vagrant.configure#中的“2”配置配置版本(我们支持旧样式#向后兼容)。请不要更改它,除非你知道你在做什么。Vagrant.configure("2")do|config|#最常见的配置选项在下面记录和注释。#如需完整参考,请参阅位于#https://docs.vagrantup.com的在线文档。#每个Vagrant开发环境都需要一个盒子。您可以在https://vagrantcloud.com/search搜索#个盒子。config.vm.box="base"#禁用自动框更新检查。如果你禁用它,那么#boxes只会在用户运行时检查更新#`vagrantboxoutdated`。不推荐这样做。#config.vm.box_check_update=false#创建转发p允许从主机上的端口访问机器内特定端口的ort映射。在下面的示例中,#accessing"localhost:8080"将访问来宾计算机上的端口80。#注意:这将启用对打开的端口的公共访问#config.vm.network"forwarded_port",guest:80,host:8080#创建一个转发端口映射,允许从机器上的端口访问特定端口#主机,只允许访问#通过127.0.0.1禁用公共访问#config.vm.network"forwarded_port",guest:80,host:8080,host_ip:"127.0.0.1"#创建一个私有网络,允许主机-仅使用特定IP访问机器#。#config.vm.network"private_network",ip:"192.168.33.10"#创建一个公共网络,一般匹配桥接网络。#桥接网络使机器显示为#您网络上的其他物理设备。#config.vm.network"public_network"#与来宾虚拟机共享一个额外的文件夹。第一个参数是主机上实际文件夹的路径。第二个参数是#来宾上安装文件夹的路径。可选的第三个#参数是一组非必需选项。#config.vm.synced_folder"../data","/vagrant_data"#Provider-specificconfiguration这样你就可以微调Vagrant的各种#backingproviders。这些公开特定于提供者的选项。#VirtualBox示例:##config.vm.provider"virtualbox"do|vb|##启动机器时显示VirtualBoxGUI#vb.gui=true###自定义VM上的内存量:#vb.memory="1024"#end##查看您正在使用的提供程序的文档更多#关于可用选项的信息。#使用shell脚本启用配置。还提供了其他供应器,例如#Puppet、Chef、Ansible、Salt和Docker。请参阅#文档以获取有关其特定语法和使用的更多信息。#config.vm.provision"shell",inline:<<-SHELL#apt-getupdate#apt-getinstall-yapache2#SHELLend现在这个VagrantFile将创建基本的虚拟机,但Vagrant背后的想法是拥有虚拟机为我们的特定任务配置的机器,因此我们删除注释并调整配置。VagrantFile:#-*-mode:ruby??-*-#vi:setft=ruby:Vagrant.configure("2")do|config|#将Linux版本设置为DebianJessieconfig.vm.box="debian/jessie64"#设置Box的IPconfig.vm.network"private_network",ip:"192.168.33.10"#将我们的项目目录与WWW同步directoryconfig.vm.synced_folder"~/Projects","/var/www/"#RunthefollowingtoProvisionconfig.vm.provision"shell",path:"install.sh"end现在我们有一个简单的VagrantFile设置Linux版本到debianjessie,设置一个IP供我们使用,并同步我们感兴趣的文件夹,最后运行install.sh,这是我们可以运行shell命令的地方。安装.sh:#!/usr/bin/envbash#VariablesDBHOST=localhostDBNAME=dbnameDBUSER=dbuserDBPASSWD=test123echo"[Provisioningmachine]"echo"1)UpdateAPT..."apt-get-qqupdateecho"1)InstallUtilities..."apt-getinstall-ytidypdftkcurlxpdfimagemagickopensslvimgitecho"2)安装Apache..."apt-getinstall-yapache2echo"3)安装PHP和包..."apt-getinstall-yphp5libapache2-mod-php5libssh2-phpphp-pearphp5-cliphp5-commonphp5-curlphp5-devphp5-gdphp5-imagickphp5-imapphp5-intlphp5-mcryptphp5-memcachedphp5-mysqlphp5-pspellphp5-xdebugphp5-xmlrpc#php5-suhosin-extension,php5-mysqlndecho"4)安装MySQL..."debconf-set-selections<<<"mysql-servermysql-server/root_passwordpasswordsecret"debconf-set-selections<<<"mysql-servermysql-server/root_password_againpasswordsecret"apt-getinstall-ymysql-servermysql-uroot-p$DBPASSWD-e"CREATEDATABASE$DBNAME"mysql-uroot-p$DBPASSWD-e"grantallprivilegeson$DBNAME.*to'$DBUSER'@'localhost'identifiedby'$DBPASSWD'"回声"5)生成自签名证书..."mkdir-p/etc/ssl/localcertsopensslreq-new-x509-days365-nodes-subj"/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"-out/etc/ssl/localcerts/apache.pem-keyout/etc/ssl/localcerts/apache.keychmod600/etc/ssl/localcerts/apache*echo"6)安装Apache..."a2enmodrewrite>/etc/apache2/sites-enabled/000-default.confecho"
