IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Mac下部署VirtualBox + Vagrant

    showerlee发表于 2015-10-19 07:25:56
    love 0

    QQ20151019-2@2x

    Vagrant实际上一套虚拟机管理工具,基于Ruby开发,底层支持VirtualBox、VMware甚至AWS、docker等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux或者Windows 开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行.

    程序猿在码字前都会在自己的本地去搭建开发环境, 新手大多都会下载自己用起来顺手的开发语言(PHP, JAVA)的一键安装包, 搞的自己的电脑面目全非. 稍微入行久一点的, 有点洁癖的会装个虚拟机, 将自己的环境配置到虚拟机里.

    但实际情况是我们开发环境或多或少肯定和部署环境会有不一致,需要上线前大量调试, 每个开发人员都自己去搭建本地环境, 安装虚拟机、下载ISO镜像、选择规格安装创建vm、安装OS、配置等. 这些问题都会耗费非常多的时间, 而且会最终导致程序员的环境和线上环境不一致出现的各种程序BUG.

    vagrant 的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机, 然后发给所有的同事是一样的, vagrant只是简单地帮你自动化这个过程, 比如 vagrant可以通过一个配置文件来生成一个虚拟机, 在本地和虚拟机之间共享文件,把一个虚拟机分享给别人等等, 而且vagrant本身就是一个CLI工具, 通过 Command-Line 控制的好处就是可以自动化、脚本化。

    所以vagrant本身也符合我们自动化运维的初衷, 实际线上我们不仅可以将不同系统版本, 不同语言平台的开发环境打包成一个文件去共享给我们的同事使用, 而且可以将我们自定义好的系统包应用到我们的线上服务器的预安装过程中.

    实现从集中化安装 ==> 环境配置 ==> 应用部署 全自动化的auto deployment.


    一. 环境部署

    Local system: MAC OS X 10.10.5

    VirtualBox: VirtualBox-4.3.30

    Vagrant: vagrant_1.7.3

    Vagrant sample system: CentOS6.7 x64

    1.本地安装VirtualBox

    下载地址: http://download.virtualbox.org/virtualbox/4.3.30/VirtualBox-4.3.30-101610-OSX.dmg

    2.本地安装Vagrant(需VPN)

    下载地址: https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.3.dmg

    TIPS: 这里如果之前安装过低版本的vagrant, 务必使用自带uninstall.tool卸载低版本, 并删除家目录下vagrant.d与vagrant目录, 避免出现随后的秘钥认证BUG.

    二. Vagrant配置

    开发人员使用Vagrant的初衷是获取运维人员定制好的box模板, CLI进入开发环境. 
    这里我们可以去官方下载现成模板文件(http://vagrantcloud.com), 也可以自己定制的模板文件.
    由于远程下载模板会耗费大量的时间, 笔者这里会详细配置如何本地定制vagrant模板文件, 这样也可以避免使用第三方的box带来的安全隐患

    1.在Virtualbox新建虚拟机并安装CentOS 6.7 x64(略)

    安装完毕后, 我们可以定制这个系统需要配置系统参数以及需要安装的所有程序, 例如JAVA, PHP, PYTHON, Apache, Nginx etc…

    方便我们给程序员构建一个完整的系统平台. 

    2.配置虚拟机网卡为NAT模式, 并设置端口映射(port forwarding)

    [Name: SSH, Protocol: TCP, Host IP: 127.0.0.1, Host Port: 2222, Guest IP: blank, Guest Port: 22]

    QQ20151019-1@2x

    3.进入安装好的CentOS控制台命令行

    # vi /etc/sysconfig/network-scripts/ifcfg-eth0

    删除所有, 加入以下内容

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp

    # service network restart

    3.查看本地2222端口是否映射到虚拟机22端口

    # lsof -i:2222

    SSH登陆虚拟机映射端口

    # ssh -p2222 root@127.0.0.1

    成功登陆则NAT配置完成

    Tip: 这里vagrant的SSH认证是通过vbox NAT的方式进行连接, 不可以用桥接模式, 配置完成保证虚拟机可以连接外网.

    4.封装打包

    这里进入虚拟机

    1).创建一个用户名密码都为vagrant的账户.

    # adduser vagrant && passwd vagrant

    2).忽略vagrant账户的密码提示.

    # visudo

    添加:

    vagrant ALL=(ALL) NOPASSWD:ALL

    3).修改root密码为vagrant

    # passwd

    4).为vagrant创建一个本地MAC到CentOS的秘钥认证

    # cd /home/vagrant

    # mkdir .ssh

    # vi .ssh/authorized_keys

    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key

    # chmod 700 .ssh

    # chmod 600 .ssh/authorized_keys

    # chown -R vagrant:vagrant .ssh

    # service sshd restart

    5).安装GUEST TOOLS 

    a.下载VBoxGuestAdditions并在创建的虚拟机内加载该镜像

    http://download.virtualbox.org/virtualbox/4.3.30/VBoxGuestAdditions_4.3.30.iso

    # mkdir /mnt/cdrom && mount /dev/cdrom /mnt/cdrom

    # cd /mnt/cdrom

    安装GUEST TOOLS依赖包

    # yum install gcc kernel-devel-2.6.32-573.el6.x86_64 perl -y

    执行安装脚本

    # ./VBoxLinuxAdditions.run

    重启系统使其生效

    5.在MAC上执行最终的打包工作

    # sudo vi /opt/vagrant/embedded/gems/gems/vagrant-1.7.3/plugins/communicators/ssh/communicator.rb

    找到171行,将该行替换成:

    @machine.env.data_dir.join("private_key").open("w+") do |f|

    TIPS: Fix在vagrant1.73在MAC上使用vagrant package的BUG(已被逼到砸键盘...)

    # cd ~/Work/vagrant

    # vagrant package --base "centos6.7_x64 Clone" from virtualbox --output CentOS-6.7-x86_64-201511015.virtualbox.box

    Tips: centos6.7_x64 Clone为在virtual box创建的虚拟机名, 可用VBoxManage list vms获取.

    ==> 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.
    ==> centos6.7_x64 Clone: Forcing shutdown of VM...
    ==> centos6.7_x64 Clone: Clearing any previously set forwarded ports...
    ==> centos6.7_x64 Clone: Exporting VM...
    ==> centos6.7_x64 Clone: Compressing package to: /Users/leonli/Work/vagrant/CentOS-6.7-x86_64-201511015.virtualbox.box

    最终生成CentOS-6.7-x86_64-201511015.virtualbox.box模板文件.

    3.使用该模板

    # cd ~/Work/vagrant

    # vagrant box add -name CentOS-6.7 ./CentOS-6.7-x86_64-201511015.virtualbox.box

    # vagrant init CentOS-6.7

    # vi Vagrantfile

    TIPS: Fix vagrant1.73 for mac极其坑人的BUG, 原因就是加入这两行会阻止vagrant up时重新向虚拟机模板更新vagrant用户的公钥, 如果不阻止则在启动虚拟机的时候会出现"Authentication failure. Retrying..."的错误, 这个New feature我理解的初衷应该是为了提高安全性, 但你模板的公钥更新了, MAC的私钥呢亲?  ╮(╯▽╰)╭ 也是醉了...

    老外吐槽版传送门: https://github.com/mitchellh/vagrant/issues/5186

    倒数第二行, 即end前添加

    config.ssh.insert_key = false
    config.ssh.pty= true

    # vagrant up

    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Clearing any previously set forwarded ports...
    ==> default: Clearing any previously set network interfaces...
    ==> default: Preparing network interfaces based on configuration...
        default: Adapter 1: nat
    ==> default: Forwarding ports...
        default: 22 => 2222 (adapter 1)
    ==> default: Booting VM...
    ==> 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...
    ==> default: Machine booted and ready!
    ==> default: Checking for guest additions in VM...
    ==> default: Mounting shared folders...
        default: /vagrant => /Users/leonli/Work/vagrant

    # vagrant ssh

    若直接登录虚拟机成功, 则大功告成.

    TIPS: 程序员如果是windows平台, 则可以直接去下载安装win版本的vagrant和virtualbox, 然后cmd进行模板加载操作.

    常见命令

    vagrant suspend 将虚拟机置于休眠状态。这时候主机会保存虚拟机的当前状态。再用vagrant up启动虚拟机时能够返回之前工作的状态。这种方式优点是休眠和启动速度都很快,只有几秒钟。缺点是需要额外的磁盘空间来存储当前状态。

    vagrant halt 则是关机。如果想再次启动还是使用vagrant up命令,不过需要多花些时间。

    vagrant destroy 则会将虚拟机从磁盘中删除。如果想重新创建还是使用vagrant up命令。

    vagrant reload 从Vagrantfile重新启动虚拟机。

    vagrant global-status 输出所有虚拟机当前运行状态,关机、已启动等。


    这样我们就可以把这个box应用到开发人员测试和线上使用, 从而统一环境. 使"代码在我机子上运行没有问题"这种说词扼杀在摇篮里.

    声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权
    转载请注明来源:一路向北的博客
    本文链接地址:http://www.showerlee.com/archives/1613


沪ICP备19023445号-2号
友情链接