<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; Vagrant</title>
	<atom:link href="http://www.showerlee.com/archives/category/ci-cd/vagrant/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Mac下部署VirtualBox + Vagrant</title>
		<link>http://www.showerlee.com/archives/1613</link>
		<comments>http://www.showerlee.com/archives/1613#comments</comments>
		<pubDate>Mon, 19 Oct 2015 07:25:56 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Vagrant]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1613</guid>
		<description><![CDATA[Vagrant实际上一套虚拟机管理工具，基于Ruby开发，底层支持VirtualBox、VMware甚至AWS [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/10/QQ20151019-2@2x1.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/10/QQ20151019-2@2x1.png" alt="QQ20151019-2@2x" width="227" height="240" class="alignnone size-full wp-image-1633" /></a>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/archives/tag/vagrant" title="查看Vagrant中的全部文章" class="tag_link">Vagrant</a>实际上一套虚拟机管理工具，基于Ruby开发，底层支持VirtualBox、VMware甚至AWS、docker等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux或者Windows 开发环境，分发给团队成员。成员可以在自己喜欢的桌面系统（Mac/Windows/Linux）上开发程序，代码却能统一在封装好的环境里运行.
</p>
<p>
程序猿在码字前都会在自己的本地去搭建开发环境, 新手大多都会下载自己用起来顺手的开发语言(PHP, JAVA)的一键安装包, 搞的自己的电脑面目全非. 稍微入行久一点的, 有点洁癖的会装个虚拟机, 将自己的环境配置到虚拟机里.</p>
<p>但实际情况是我们开发环境或多或少肯定和部署环境会有不一致，需要上线前大量调试, 每个开发人员都自己去搭建本地环境, 安装虚拟机、下载ISO镜像、选择规格安装创建vm、安装OS、配置等. 这些问题都会耗费非常多的时间, 而且会最终导致程序员的环境和线上环境不一致出现的各种程序BUG.</p>
<p>vagrant 的主要意义是让所有开发人员都使用和线上服务器一样的环境，本质上和你新建一个虚拟机, 然后发给所有的同事是一样的, vagrant只是简单地帮你自动化这个过程, 比如 vagrant可以通过一个配置文件来生成一个虚拟机, 在本地和虚拟机之间共享文件，把一个虚拟机分享给别人等等,&nbsp;而且vagrant本身就是一个CLI工具, 通过 Command-Line 控制的好处就是可以自动化、脚本化。</p>
<p>所以vagrant本身也符合我们自动化运维的初衷, 实际线上我们不仅可以将不同系统版本, 不同语言平台的开发环境打包成一个文件去共享给我们的同事使用, 而且可以将我们自定义好的系统包应用到我们的线上服务器的预安装过程中.</p>
<p>
	实现从集中化安装 ==&gt; 环境配置 ==&gt; 应用部署 全自动化的auto deployment.
</p>
<p>
	
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;color:#337FE5;"><strong>一. 环境部署</strong></span>
</p>
<p>
	Local system: MAC OS X 10.10.5
</p>
<p>
	VirtualBox: VirtualBox-4.3.30
</p>
<p>Vagrant: vagrant_1.7.3</p>
<p>
	Vagrant sample system: CentOS6.7 x64
</p>
<p>
	
</p>
<p>
	1.本地安装VirtualBox
</p>
<p>下载地址: <a href="http://download.virtualbox.org/virtualbox/4.3.30/VirtualBox-4.3.30-101610-OSX.dmg" rel="nofollow">http://download.virtualbox.org/virtualbox/4.3.30/VirtualBox-4.3.30-101610-OSX.dmg</a></p>
<p>2.本地安装Vagrant(需VPN)</p>
<p>
	下载地址: <a href="https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.3.dmg" rel="nofollow">https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.3.dmg</a>
</p>
<p>
	<span style="color:#E53333;">TIPS: 这里如果之前安装过低版本的vagrant, 务必使用自带uninstall.tool卸载低版本, 并删除家目录下vagrant.d与vagrant目录, 避免出现随后的秘钥认证BUG.</span>
</p>
<p></p>
<p>
	<span style="color:#337FE5;"><strong>二. Vagrant配置</strong></span>
</p>
<p>开发人员使用Vagrant的初衷是获取运维人员定制好的box模板, CLI进入开发环境.&nbsp;<br />
这里我们可以去官方下载现成模板文件(<a href="http://vagrantcloud.com" rel="nofollow">http://vagrantcloud.com</a>), 也可以自己定制的模板文件.<br />
由于远程下载模板会耗费大量的时间, 笔者这里会详细配置如何本地定制vagrant模板文件, 这样也可以避免使用第三方的box带来的安全隐患</p>
<p>
	
</p>
<p>
	1.在Virtualbox新建虚拟机并安装CentOS 6.7 x64(略)
</p>
<p>
	<span style="line-height:1.5;">安装完毕后, 我们可以定制这个系统需要配置系统参数以及需要安装的所有程序, 例如JAVA, PHP, PYTHON, Apache, Nginx etc…</span>
</p>
<p>
	<span style="line-height:1.5;">方便我们给程序员构建一个完整的系统平台.&nbsp;</span>
</p>
<p>
	
</p>
<p>
	2.<span style="line-height:1.5;">配置虚拟机网卡为NAT模式, 并设置端口映射(port forwarding)</span>
</p>
<p>
	<span style="line-height:1.5;">[Name: SSH, Protocol: TCP, Host IP: 127.0.0.1, Host Port: 2222, Guest IP: blank, Guest Port: 22]</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/wp-content/uploads/2015/10/QQ20151019-1@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/10/QQ20151019-1@2x-1024x117.png" alt="QQ20151019-1@2x" width="1024" height="117" class="alignnone size-large wp-image-1630" /></a><br />
</span>
</p>
<p>
	
</p>
<p>
	3.进入安装好的CentOS控制台命令行
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/sysconfig/network-scripts/ifcfg-eth0</span>
</p>
<p>
	<span style="line-height:1.5;">删除所有, 加入以下内容</span>
</p>
<pre class="prettyprint lang-bsh">DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp</pre>
<p>
	# service network restart
</p>
<p>
	
</p>
<p>
	3.查看本地2222端口是否映射到虚拟机22端口
</p>
<p>
	<span style="line-height:1.5;"># lsof -i:2222</span>
</p>
<p>
	<span style="line-height:1.5;">SSH登陆虚拟机映射端口</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh -p2222 root@127.0.0.1</span>
</p>
<p>
	<span style="line-height:1.5;">成功登陆则NAT配置完成</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Tip: 这里vagrant的SSH认证是通过vbox NAT的方式进行连接, 不可以用桥接模式, 配置完成保证虚拟机可以连接外网.</span>
</p>
<p>
	
</p>
<p>
	4.封装打包
</p>
<p>
	<span style="line-height:1.5;">这里进入虚拟机</span>
</p>
<p>
	<span style="line-height:1.5;">1).创建一个用户名密码都为vagrant的账户.</span>
</p>
<p>
	<span style="line-height:1.5;"># adduser vagrant &amp;&amp; passwd vagrant</span>
</p>
<p>
	
</p>
<p>
	2).忽略vagrant账户的密码提示.
</p>
<p>
	<span style="line-height:1.5;"># visudo</span>
</p>
<p>
	<span style="line-height:1.5;">添加:</span>
</p>
<pre class="prettyprint lang-bsh">vagrant ALL=(ALL) NOPASSWD:ALL</pre>
<p>
	
</p>
<p>
	3).修改root密码为vagrant
</p>
<p>
	# passwd
</p>
<p>
	
</p>
<p>
	4).为vagrant创建一个本地MAC到CentOS的秘钥认证
</p>
<p>
	<span style="line-height:1.5;"># cd /home/vagrant</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir .ssh</span>
</p>
<p>
	<span style="line-height:1.5;"># vi .ssh/authorized_keys</span>
</p>
<pre class="prettyprint lang-bsh">ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key</pre>
<p>
	<span style="line-height:1.5;"># chmod 700 .ssh</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod 600 .ssh/authorized_keys</span>
</p>
<p>
	<span style="line-height:1.5;"># chown -R vagrant:vagrant .ssh</span>
</p>
<p>
	<span style="line-height:1.5;"># service sshd restart</span>
</p>
<p>
	
</p>
<p>
	5).安装GUEST TOOLS&nbsp;
</p>
<p>
	<span style="line-height:1.5;">a.下载VBoxGuestAdditions并在创建的虚拟机内加载该镜像</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://download.virtualbox.org/virtualbox/4.3.30/VBoxGuestAdditions_4.3.30.iso" rel="nofollow">http://download.virtualbox.org/virtualbox/4.3.30/VBoxGuestAdditions_4.3.30.iso</a></span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir /mnt/cdrom &amp;&amp; mount /dev/cdrom /mnt/cdrom</span>
</p>
<p>
	<span style="line-height:1.5;"># cd /mnt/cdrom</span>
</p>
<p>
	
</p>
<p>
	安装GUEST TOOLS依赖包
</p>
<p>
	<span style="line-height:1.5;"># yum install gcc kernel-devel-2.6.32-573.el6.x86_64 perl -y</span>
</p>
<p>
	
</p>
<p>
	执行安装脚本
</p>
<p>
	<span style="line-height:1.5;"># ./VBoxLinuxAdditions.run</span>
</p>
<p>
	<span style="line-height:1.5;">重启系统使其生效</span>
</p>
<p>
	
</p>
<p>
	5.在MAC上执行最终的打包工作
</p>
<p>
	<span style="line-height:1.5;"># sudo vi /opt/vagrant/embedded/gems/gems/vagrant-1.7.3/plugins/communicators/ssh/communicator.rb</span>
</p>
<p>
	<span style="line-height:1.5;">找到171行,将该行替换成:</span>
</p>
<pre class="prettyprint lang-bsh">@machine.env.data_dir.join("private_key").open("w+") do |f|</pre>
<p>
	<span style="line-height:1.5;"><span style="line-height:1.5;color:#E53333;">TIPS: Fix在vagrant1.73在MAC上使用vagrant package的BUG</span><span style="line-height:1.5;color:#E53333;">(已被逼到砸键盘...)</span><br />
</span>
</p>
<p>
	<span style="line-height:1.5;"># cd ~/Work/vagrant</span>
</p>
<p>
	<span style="line-height:1.5;"># vagrant package --base "centos6.7_x64 Clone" from virtualbox --output CentOS-6.7-x86_64-201511015.virtualbox.box</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Tips: centos6.7_x64 Clone为在virtual box创建的虚拟机名, 可用VBoxManage list vms获取.</span>
</p>
<pre class="prettyprint lang-bsh">==&gt; centos6.7_x64 Clone: Attempting graceful shutdown of VM...
    centos6.7_x64 Clone: 
    centos6.7_x64 Clone: Vagrant insecure key detected. Vagrant will automatically replace
    centos6.7_x64 Clone: this with a newly generated keypair for better security.
    centos6.7_x64 Clone: 
    centos6.7_x64 Clone: Inserting generated public key within guest...
    centos6.7_x64 Clone: Removing insecure key from the guest if it's present...
    centos6.7_x64 Clone: Key inserted! Disconnecting and reconnecting using new SSH key...
    centos6.7_x64 Clone: Guest communication could not be established! This is usually because
    centos6.7_x64 Clone: SSH is not running, the authentication information was changed,
    centos6.7_x64 Clone: or some other networking issue. Vagrant will force halt, if
    centos6.7_x64 Clone: capable.
==&gt; centos6.7_x64 Clone: Forcing shutdown of VM...
==&gt; centos6.7_x64 Clone: Clearing any previously set forwarded ports...
==&gt; centos6.7_x64 Clone: Exporting VM...
==&gt; centos6.7_x64 Clone: Compressing package to: /Users/leonli/Work/vagrant/CentOS-6.7-x86_64-201511015.virtualbox.box</pre>
<p>
	<span style="line-height:1.5;">最终生成CentOS-6.7-x86_64-201511015.virtualbox.box模板文件.</span>
</p>
<p>
	
</p>
<p>
	3.使用该模板
</p>
<p>
	<span style="line-height:1.5;"># cd ~/Work/vagrant</span>
</p>
<p>
	<span style="line-height:1.5;"># vagrant box add -name CentOS-6.7 ./CentOS-6.7-x86_64-201511015.virtualbox.box</span>
</p>
<p>
	<span style="line-height:1.5;"># vagrant init CentOS-6.7</span>
</p>
<p>
	<span style="line-height:1.5;"># vi Vagrantfile</span>
</p>
<p>
	<span style="color:#E53333;line-height:1.5;">TIPS: Fix vagrant1.73 for mac极其坑人的BUG, 原因就是加入这两行会阻止vagrant up时重新向虚拟机模板更新vagrant用户的公钥, 如果不阻止则在启动虚拟机的时候会出现"Authentication failure. Retrying..."的错误, 这个New feature我理解的初衷应该是为了提高安全性, 但你模板的公钥更新了, MAC的私钥呢亲? &nbsp;╮(╯▽╰)╭ 也是醉了...</span>
</p>
<p>
	<span style="color:#E53333;line-height:1.5;">老外吐槽版传送门:&nbsp;</span><a href="https://github.com/mitchellh/vagrant/issues/5186" target="_blank">https://github.com/mitchellh/vagrant/issues/5186</a>
</p>
<p>
	<span style="line-height:1.5;">倒数第二行, 即end前添加</span>
</p>
<pre class="prettyprint lang-bsh">config.ssh.insert_key = false
config.ssh.pty= true</pre>
<p>
	# vagrant up
</p>
<pre class="prettyprint lang-bsh">Bringing machine 'default' up with 'virtualbox' provider...
==&gt; default: Clearing any previously set forwarded ports...
==&gt; default: Clearing any previously set network interfaces...
==&gt; default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==&gt; default: Forwarding ports...
    default: 22 =&gt; 2222 (adapter 1)
==&gt; default: Booting VM...
==&gt; default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==&gt; default: Machine booted and ready!
==&gt; default: Checking for guest additions in VM...
==&gt; default: Mounting shared folders...
    default: /vagrant =&gt; /Users/leonli/Work/vagrant</pre>
<p>
	<span style="line-height:1.5;"># vagrant ssh</span>
</p>
<p>
	<span style="line-height:1.5;">若直接登录虚拟机成功, 则大功告成.</span>
</p>
<p>
	<span style="color:#E53333;line-height:1.5;">TIPS: 程序员如果是windows平台, 则可以直接去下载安装win版本的vagrant和virtualbox, 然后cmd进行模板加载操作.</span>
</p>
<p>
	
</p>
<p>
	常见命令
</p>
<p>
	vagrant suspend 将虚拟机置于休眠状态。这时候主机会保存虚拟机的当前状态。再用vagrant up启动虚拟机时能够返回之前工作的状态。这种方式优点是休眠和启动速度都很快，只有几秒钟。缺点是需要额外的磁盘空间来存储当前状态。
</p>
<p>
	vagrant halt 则是关机。如果想再次启动还是使用vagrant up命令，不过需要多花些时间。
</p>
<p>
	vagrant destroy 则会将虚拟机从磁盘中删除。如果想重新创建还是使用vagrant up命令。
</p>
<p>
	vagrant reload 从Vagrantfile重新启动虚拟机。
</p>
<p>
	vagrant global-status 输出所有虚拟机当前运行状态，关机、已启动等。
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">这样我们就可以把这个box应用到开发人员测试和线上使用, 从而统一环境. 使"代码在我机子上运行没有问题"这种说词扼杀在摇篮里.</span>
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1613">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Mac下部署VirtualBox + Vagrant" href="http://www.showerlee.com/archives/1613">http://www.showerlee.com/archives/1613</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1613/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
