Vagrant使用国内镜像安装插件和box镜像,创建自己的Vagrant box

前言
Vagrant是非常优秀的本地虚拟化管理工具。无奈国内访问速度实在感人。本文分享一些如何使用国内镜像加速的经验,让 Vagrant 的使用更加爽快。

插件镜像
Vagrant 的插件主要托管在RubyGems仓库,在国内几乎无法访问。万幸的是国内已经有RubyChina镜像。不过 Vagrant 使用这个镜像安装插件的方法有些特殊:

vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ <plugin>...
有两个地方特别需要注意:

--plugin-clean-sources这个参数容易被忽略,官方文档写的也比较模糊,必须在DEBUG模式下才能发现这个参数的作用,就是清理掉 Vagrant 默认使用的 Gems 仓库

--plugin-clean-sources和--plugin-source参数的顺序特别需要注意,必须--plugin-clean-sources在前,--plugin-source在后,才能保证先清理掉默认的 Vagrant 使用的 Gems 仓库,然后添加 RubyChina 镜像仓库。否则顺序反了的话就会把所有仓库全清掉,导致找不到插件仓库

体验一下速度,装个vagrant-disksize插件试试:

vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ vagrant-disksize
如果使用bash/zsh之类的 shell 环境,可以考虑使用alias简化命令:

alias vagrant-plugin-install='vagrant plugin install --plugin-clean-sources --plugin-source'
将以上命令添加到~/.bashrc(bash 环境)或~/.zshrc(zsh 环境),下次打开终端即可生效。

这样以后想从镜像站安装插件只需要使用命令:

vagrant-plugin-install <plugin>...
方便太多了,以后可以畅快的安装 Vagrant 插件了。

Vagrant Box 镜像
并没有统一的 Vagrant Box 镜像地址,需要独立查找。

使用 Vagrant Box 镜像的方法如下:

在空目录下通过命令直接初始化:

vagrant init name url
其中name为期望的虚拟机的别名,url指向一个box文件的镜像 URL。

已有Vagrantfile的情况下,编辑或添加配置项config.vm.box_url = "box文件的url"

我这边整理了几个常见的 box 镜像以供参考

Ubuntu
清华大学镜像站,如: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box

启动一个 Ubuntu 18.04 的虚拟机:

vagrant init ubuntu-bionic https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box
其他版本在各自的开发代号目录下都可以找到。

CentOS
中科大镜像站,如: https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box

启动一个 CentOS 7 的虚拟机:

vagrant init centos7 https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box
其他版本的镜像也可以在该目录下找到。

其他可能会用到的镜像
如果启用了vagrant-vbguest插件,可能希望通过镜像下载 Virtualbox 扩展,编辑Vagrantfile:

config.vbguest.iso_path = "https://mirrors.tuna.tsinghua.edu.cn/virtualbox/%{version}/VBoxGuestAdditions_%{version}.iso"

小结
本文总结了 Vagrant 可能会用到的国内镜像,通过国内镜像加速,大大提升 Vagrant 使用体验。

 

征服诱人的Vagrant!

 
转载

一、背景

​  最近要开始深入学习分布式相关的东西了,那第一步就是在自己的电脑上安装虚拟机,以前在Windows平台,我选择用VMware Workstation作为虚拟机软件,现在在Mac系统下,感觉不是很适合了,然后就有朋友推荐我使用Vagrant来在Mac系统作为虚拟机管理软件,那么本文我们就来聊一聊跟这货相关的蛮有意思的东西。

二、Vagrant介绍

​  Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。我们可以使用它来干如下这些事:

  • 建立和删除虚拟机
  • 配置虚拟机运行参数
  • 管理虚拟机运行状态
  • 自动配置和安装开发环境
  • 打包和分发虚拟机运行环境

​  Vagrant的运行,需要依赖某项具体的虚拟化技术,最常见的有VirtualBox以及VMWare两款,早期,Vagrant只支持VirtualBox,后来才加入了VMWare的支持。

​ 为什么我们要选择Vagrant呢?因为它有跨平台可移动自动化部署无需人工参与等优点。

  

  在Vagrant体系中,有个box(箱子)的概念,这优点类似于docker体系中的image(镜像)。基于同一个box,不同的人可以运行得到相同的内容。这个我们下文再详细说。

三、Vagrant环境的安装

​  因为我们知道vagrant依赖virtualbox,所以我们需要在安装vagrant之前先安装virtualbox,笔者初学时在网上搜索了很久,发现大部分人的vagrant教程里只说让安装vagrant并没有说要提前安装virtualbox,结果我按照他们的步骤安装完vagrant以后,发现死活起不来,当时真的是郁闷。后来又查了好久才知道这货依赖虚拟化软件,所以我又安装了virtualbox,这样我本地才把vagrant起来了。真的是坑!这个大家要注意了。

1. 下载并安装virtualbox

下载地址:https://www.virtualbox.org/wiki/Downloads

安装过程很简单,傻瓜式的一步一步点下去。

2.下载并安装vagrant

下载地址:https://www.vagrantup.com/downloads.html

安装过程依旧没什么难的,跟着提示一步一步next。

注意:下载的时候,virtualbox和vagrant的版本要搭配,建议都下载最新版的。还有就是要根据自己的操作系统版本进行选择32位或者64位下载。在windows系统中,可能还需要配置环境变量以及一定要开启VT-x/AMD-V硬件加速

四、Vagrant基本命令

1. vagrant box基本命令

  • 列出本地环境中所有的box

    vagrant box list
  • 添加box到本地vagrant环境

    vagrant box add box-name(box-url)
  • 更新本地环境中指定的box

    vagrant box update box-name
  • 删除本地环境中指定的box

    vagrant box remove box-name
  • 重新打包本地环境中指定的box

    vagrant box repackage box-name
  • 在线查找需要的box

    官方网址:https://app.vagrantup.com/boxes/search

2. vagrant基本命令

  • 在空文件夹初始化虚拟机

    vagrant init [box-name]
  • 在初始化完的文件夹内启动虚拟机

    vagrant up
  • ssh登录启动的虚拟机

    vagrant ssh
  • 挂起启动的虚拟机

    vagrant suspend
  • 重启虚拟机

    vagrant reload
  • 关闭虚拟机

    vagrant halt
  • 查找虚拟机的运行状态

    vagrant status
  • 销毁当前虚拟机

    vagrant destroy

五、Vagrant高级功能

1. 端口转发

关于端口转发的配置方式有以下两种:

  • 挂起虚拟机后,在virtualbox的设置里配置转发规则(缺点是:每次通过vagrant reload命令重启虚拟机以后失效)

    首先打开VirtualBox管理器:

  

然后设置转发规则:

添加对应的转发规则,然后点击OK保存,再使用命令vagrant up启动虚拟机。

注意:一定不能使用vagrant reload命令,否则启动后规则丢失无效。

  • 在vagrant的配置文件Vagrantfile里配置转发规则(永久有效,重启不会丢失)

    在配置文件里增加以下配置:

    config.vm.network :forwarded_port, guest: 80, host: 8889
    config.vm.network :forwarded_port, guest: 8888, host: 9999

    这样的话我们就获得了永久的8889到80、9999到8888的转发。

2. 网络配置

vagrant支持以下三种网络配置:

Forwarded port(端口映射)

是指将宿主计算机的端口映射到虚拟机上的某个端口上,访问宿主计算机的该端口时,请求实际会被转发到虚拟机上指定的端口,配置文件设置语法为:

config.vm.network :forwarded_port, guest: 80, host: 8889

优点:简单、容易理解、容易实现外网访问虚拟机。

缺点:需映射很多端口时较麻烦、不支持在宿主机器上使用小于1024的端口来转发(如:不能使用SSL的443端口来进行https连接)。

官网配置文档地址:https://www.vagrantup.com/docs/networking/forwarded_ports.html

Private network(私有网络)

这种网络配置下,只有主机可以访问虚拟机,如果多个虚拟机设置定在同一个网段也可以相互访问,当然虚拟机也是可以访问外部网络的。配置语法如下:

config.vm.network "private_network", ip: "192.168.50.4" # 固定IP

还可以设置动态IP,配置语法如下:

config.vm.network "private_network", type: "dhcp"

优点:安全,只能自己访问。

缺点:因私有原有,所以其他团队成员不能和你协作。

官网配置文档地址:https://www.vagrantup.com/docs/networking/private_network.html

Public network(公有网络)

这种配置下,虚拟机享受实体机一样的待遇,一样的网络配置,vagrant 1.3版本以后这种配置也支持设定固定IP,配置语法如下:

config.vm.network "public_network", ip: "192.168.50.4"

还可以设置桥接网卡,配置语法如下:

config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"

优点:方便团队协作,别人可以访问你的虚拟机。

缺点:需要有网络,有路由器分配IP

官网配置文档地址:https://www.vagrantup.com/docs/networking/public_network.html

3.共享目录

​   有时候,我们希望虚拟机能和我们的主机共享一些文件夹,这时候在vagrant的配置文件中进行配置来达到共享目录的目的。

​ vagrant的共享目录类型有:

注意:配置完成,我们重新启动虚拟机时发现报错了,这时候别慌,我们给出解决办法传送门

4. 虚拟机优化

  • 自定义虚拟机名称

    config.vm.provider "virtualbox" do |vb|
    vb.name = "ubuntu-hafiz"
    end
  • 自定义虚拟机主机名称

    config.vm.hostname="hafiz"
  • 自定义虚拟机内存和CPU

    config.vm.provider "virtualbox" do |vb|
    vb.name = "ubuntu-imooc"
    vb.memory = "1024"
    vb.cpus = 2
    end

    配置好后重启虚拟机,然后进入虚拟机:

    使用top命令然后再按1显示当前CPU个数:

  

  使用free -m命令显示当前虚拟机内存:

  

5. 打包分发

​   当我们基于一个box启动一个虚拟机以后,我们在里面部署了专属自己的环境,那这个时候我们想要把自己的这套配置好的环境共享给别人怎么办呢?答案是将虚拟机打包分发。命令如下:

vagrant package [--output new_box_name]

新生成的box名称是选填的,默认为package.box。

六、总结

​   通过本文,我们对vagrant有了一个大概的了解,那么用起来也会很顺手,用到一个东西,我们还是要追求知其然知其所以然,这样对我们自己负责,同时遇见问题我们也好下手去思考和解决。我就是我,不一样的烟火~

Vagrant入门

(一)快速入门

首先需要创建一个目录用于存放Vagrantfile文件以及Vagrant在工作中的数据:

mkdir my-vagrant-project
cd my-vagrant-project

 

然后初始化Vagrant工程:

vagrant init ubuntu/trusty64

 

该命令会在当前目录下创建Vagrantfile,并且指定所使用的box为ubuntu/trusty64,该box由Hashicorp官网提供。此时,Vagrant发现box的名字的格式为“用户名/box名”,则会使用“https://atlas.hashicorp.com/用户名/box名”来下载该box。对于非官网提供的box,可以通过以下命令创建:

vagrant init my-box https://boxes.company.com/my.box

 

其中,my-box为该box的名字,后面的URL为该box的下载地址。接下来就可以启动虚拟机了:

vagrant up

 

此时Vagrant会先从Hashicorp下载ubuntu/trusty64这个box(如果先前下载过了则跳过),然后启动虚拟机。在默认情况下,Virtualbox将作为provider,当然你也可以使用其他provider,比如以下命令将启动一个hyperv虚拟机:

vagrant up --provider hyperv

 

登录到虚拟机:

vagrant ssh

 

此时vagrant将使用默认的用户vagrant以及预设的SSH公钥密钥键值对直接登录虚拟机。

 

关闭虚拟机:

vagrant halt

 

删除虚拟机:

vagrant destroy

 

请注意,vagrant destroy只会删除虚拟机本身,也即你在Virtualbox将看不到该虚拟机,但是不会删除该虚拟机所使用的box。

 

Vagrant还会在Vagrantfile所在同级目录下创建一个.vagrant隐藏文件夹,该文件夹包含了在本地运行虚拟机的一些信息。如果使用了代码库管理(比如Git),这个.vagrant文件夹应该被ignore掉。

 

(二)添加和查看所下载的box

 Vagrant会将所下载的box保存到~/.vagrant.d/boxes目录下,除了在执行“vagrant up”时Vagrant会下载box外,你也可以单独下载box到本地:

vagrant box add ubuntu/trusty64

 

这将从Hashicorp官网上下载ubuntu/trusty64这个box,你也可以指定一个另外的URL:

vagrant box add --name mybox http://someurl.com/ubuntu.box

 

这里的mybox是一个逻辑名字,你可以用该名字来设置Vangrantfile的“config.vm.box”。

你可以在任何时候向Vagrant中添加新的box以备后用,在执行vagrant up时,Vagrant首先检查本地是有存在所需要的box,如果有则直接使用,如果没有则下载。

 

列出本地所有的box:

vagrant box list

 

删除某个box:

vagrant box remove box-name

 

(三)端口转发(Port Forwarding)

在默认情况下,Vagrant所创建的Virtualbox虚拟机使用的是NAT网络类型,即外界是不能直接访问你的虚拟机的,就连Host机器也访问不了。此时,如果你在虚拟机中启动的一个Tomcat来部署网站的测试环境,而又想外界能够访问的话,你需要使用端口转发:

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 8080, host: 8888
end

 

以上代码将Host机的8888端口转发到了虚拟机的8080端口,这样你便可以通过在Host机上访问http://localhost:8888来访问虚拟机的Tomcat了。对于Virtualbox来说,只有NAT类型的网络类型支持端口转发,这也是为什么Vagrant创建的Virtualbox虚拟机默认都有一个支持NAT的虚拟网卡,原因就是要能够支持Vagrant级别的端口转发。另外,Vagrant在第一次尝试连接虚拟机时使用的也是NAT。

 

(四)共享文件夹

在默认情况下,Vagrant所创建的虚拟机已经为我们创建了一个共享文件夹,在虚拟机上是/vagrant目录,在Host机上则为Vagrantfile所在目录,当然你也可以额外添加另外的共享文件夹:

Vagrant.configure("2") do |config|
  config.vm.synced_folder "src/", "/srv/website"
end

 

第一个参数为Host机器上的目录,第二个参数为虚拟机上的目录。

 

 (五)Provision

简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。

 

直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "shell", inline: "echo hello"
end

 

 通过引用外部脚本文件的方式:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "script.sh"
end

 

在使用Ansible时,有两种方式:(1)在Host机器上安装Ansible,(2)采用Ansible Local的方式,即在虚拟机自身上安装Ansible。对于第(1)种方法,我们需要保证Host机器上已经安装了Ansible,然后进行配置:

复制代码
Vagrant.configure("2") do |config|

  #
  # Run Ansible from the Vagrant Host
  #
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end

end
复制代码

 

在使用第(2)种方法时,Vagrant会首先检查box中是否已经安装了Ansible,如果没有,则会自动安装到虚拟机上,然后再运行provision:

复制代码
Vagrant.configure("2") do |config|
  # Run Ansible from the Vagrant VM
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end
复制代码

 

当我们多次执行“vagrant up”启动虚拟机时,provison并不会每次都执行,只有在这三种情况下provision才会运行:

  1. 首次执行vagrant up
  2. 执行vagrant provision
  3. 执行vagrant reload --provision

 

当然,你也可以在Vagrantfile中配置成每次执行vagrant up时都运行provision:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo hello",
    run: "always"
end

 

(六)网络配置

在默认情况下,对于Virtualbox而言,Vagrant将使用Virtualbox的NAT网络方式,这种方式允许虚拟机访问外部网络,但是不允许外界访问虚拟机,就连Host机器也访问不了。另外,我们可以为虚拟机配置private network和public network。在配置private network时,相当于虚拟机和Host机共同组成了一个单独的局域网,外界无法访问该局域网,但是虚拟机可以访问外界,Host机和虚拟机之间也可以互访。请注意,这里说的外界是指原本和Host处于同一局域网的其他机器。

 

使用private network时,我们可以给虚拟机指定固定的私有IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"
end

 

当然也可以使用DHCP的方式动态分配IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", type: "dhcp"
end

 

对于Virtualbox而言,此时虚拟机其实有两张网卡在工作,一种是Vagrant默认创建的NAT网卡,另一种是Host only类型的网卡提供private network。

 

在使用public network时,虚拟机和Host在网络中具有同等的地位(共同使用Host机的物理网卡与外界通信),就相当于在Host所在网络中又多了一台计算机一样,此时虚拟机可以使用网络中的DHCP服务器获得与Host处于同一个网段的IP地址,以下配置默认采用DHCP方式配置public network:

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

 

如果Host机器有多张网卡,此时运行vagrant up, Vagrant会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在Vagrantfile中进行配置:

config.vm.network "public_network", bridge: [
  "en1: Wi-Fi (AirPort)",
]

这里的 Wi-Fi(AirPort)表示使用了Mac笔记本的Airport连接到Wi-Fi。

 

除了DHCP,也可以使用静态IP:

Vagrant.configure("2") do |config|
  config.vm.network "public_network", ip: "192.168.0.5"
end

 

(七)Provider特定配置

不同的Provider有不同的特性,也存在不同的配置方式。以Virtualbox为例,Vagrant默认会给虚拟机指定一个不具备可读性的名字,比如my-vagrant-project_default_1471685053487_94837,我们可以对此进行配置予以更改:

config.vm.provider "virtualbox" do |v|
  v.name = "my_vm"
end

 

Provider的特定配置也可以覆盖Vagrant原来的配置:

复制代码
Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.provider "vmware_fusion" do |v, override|
    override.vm.box = "precise64_fusion"
  end
end
复制代码
 

创建自己的Vagrant box

在本文中我们将尝试创建自己的Vagrant box。

本文源代码:https://github.com/davenkin/vagrant/tree/master/ubuntu1604-jdk1.8-tomcat8

 

Vagrant box只是提供了一个虚拟机的基线,比如对于Harshicorp官网提供的unbuntu/trusty64这个box,相当于只是一个Ubuntu的ISO安装文件。一般来讲,在安装了操作系统之后,你都需要安装一些额外的软件以供项目所用,比如,要部署一个网站,你可能需要安装Tomcat以及MySQL等等。此时,我们可以通过在Vagrantfile中配置Provision来帮助我们自动完成这些软件安装任务。但是当需要安装的软件越来越多以及需要启动的虚拟机数量越来越多,执行Provison也会变得越来越慢,此时我们便可以将一些公共的软件预先打包到box中,即创建自己的box。然后将这样的box在团队或者公司范围内发布以供后用。当然,除了加快虚拟机启动过程,创建自己的box还使得我们预先对所有虚拟机进行相同的基本配置,比如安装公司的安全证书,比如创建属于自己的操作系统用户(默认用户名为vagrant)以及配置相应的公钥等。

 

对于Vagrant box来说,我们需要向box注入以下功能:

  1. Vagrant box中需要提供SSH功能,以便能够使用vagrant ssh命令登录虚拟机
  2. 需要提供一个默认的用户以及相应的登录方式(比如免密钥登录和密码登录),对于大多数Vagrant box来说,默认都提供了用户名为vagrant的SSH密码登录功能。
  3. 对于特定的Provider,还需要安装某些特定的软件,比如对于Virtualbox来说,为了能使共享文件夹功能能够正常工作,box中还需要安装VirtualBox Guest Additions,另外第一块网卡必须为NAT类型,因为Vagrant需要使用NAT与虚拟机完成首次通信。

 

当然,我们并不需要完全从头到尾创建一个box,而是可以在一些公共的box的基础之上通过添加额外的功能来创建自己的box,因为这些公共box已经包含了上述功能。本文便将通过使用ubuntu/xenial64作为基础来创建新的box。

 

我们将使用Shell作为Provision方式,向新的box中添加以下功能:

  1. 安装openjdk 1.8
  2. 安装Tomcat 

 

首先初始化Vagrantfile:

vagrant init -m ubuntu/xenial64

 

 

值得一提的是,ubuntu/xenial64默认使用的SSH登录用户名为ubuntu,而不是先前的vagrant。

 

编辑Vagrantfile,通过Shell安装openjdk1.8和Tomcat 8,同时设置端口转发以便Host机器能够访问Tomcat主页(由于默认的网络是Virtualbox的NAT,故Host机是不能访问到虚拟机的):

复制代码
$script = <<SCRIPT
   sudo apt-get update
   sudo apt-get -y install openjdk-8-jdk
   sudo apt-get -y install tomcat8
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: $script
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "forwarded_port", guest: 8080, host: 8080

    config.vm.provider "virtualbox" do |v|
       v.name = "my-virtualbox"
    end

end
复制代码

 

启动虚拟机:

vagrant up

 

此时在Host机上访问http://localhost:8080,你会看到“It Works!”,表示Tomcat安装及运行成功。

 

好了,前面讲的都只是如何创建虚拟机,有了这些准备我们才能够基于新建的虚拟机创建box。

 

先关闭虚拟机:

 

vagrant halt

 

 

由于在Vagrantfile中,我们为虚拟机指定了名字“my-vertualbox”,在创建box时我们可以直接通过该名字指向新建的虚拟机:

 

vagrant package --base my-virtualbox

 

 

Vagrant将创建名为package.box的新的box,此后我们便可以使用该package.box作为其他虚拟机的基础box了。另外,如果当前处于Vagrantfile文件所在目录,则可简化创建命令:

vagrant package

 

如果此时虚拟机正在运行,Vagrant将先关闭运行的虚拟机,然后创建box。另外,“vagrant package”也可以为任何Virtualbox的虚拟机创建box,而不一定非得是vagrant启动的虚拟机,只要“--base”参数指向Virtualbox的某个虚拟机名字即可。

用Vagrant创建Jenkins构建环境

本文中,我们将使用Vagrant一次性创建3台虚拟机以组成一个Jenkins的master-slave构建环境,其中包含1台Jenkins master机器,2台slave机器。我们将采用Shell作为provision工具,当然你也可以使用像Ansible、Chef等。

 

本文源代码:https://github.com/davenkin/vagrant/tree/master/multi-machine-jenkins-cluster-ubuntu1404

 

在Vagrantfile中,通过config.vm.define来定义多台机器,通过引用外部的Shell脚本进行provision,Vagrantfile如下:

复制代码
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.define "master" do |master|
      master.vm.network "private_network", ip: "192.168.2.2"
      master.vm.provision "shell", path: "master_provision.sh"
      master.vm.provider "virtualbox" do |v|
        v.name = "jenkins-master"
      end
  end

  config.vm.define "slave1" do |slave1|
      slave1.vm.network "private_network", ip: "192.168.2.3"
      slave1.vm.provision "shell", path: "slave_provision.sh"
      slave1.vm.provider "virtualbox" do |v|
        v.name = "jenkins-slave1"
      end
  end

  config.vm.define "slave2" do |slave2|
      slave2.vm.network "private_network", ip: "192.168.2.4"
      slave2.vm.provision "shell", path: "slave_provision.sh"
      slave2.vm.provider "virtualbox" do |v|
        v.name = "jenkins-slave2"
      end
  end
end
复制代码

 

在每一个config.vm.define的配置内部,我们可以使用与其外部相同的配置项,内部配置会覆盖外部配置。这样,我们可以在外部配置中设置一些所有机器都共享的配置信息,然后在每个config.vm.define内部中针对性地配置某一台机器。

 

我们使用private network组成一个局域网,分别为各台机器指定静态的IP地址,此时其实使用的Virtualbox的Host-only网络类型。

 

对于master机器而言,我们首先需要安装JDK,然后安装Jenkins server,此时的master_provision.sh如下:

复制代码
#! /bin/bash
#change apt source to be inside China to speed up apt
sudo mv /etc/apt/sources.list /etc/apt/sources.list.old
sudo cp /vagrant/sources.list /etc/apt/sources.list

#prepare for jenkins installation
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update

#install openjdk
sudo apt-get -y install default-jdk

#install jenkins
sudo apt-get -y install jenkins
复制代码

 

请注意,在provision一开始,我们更新了apt的源以提高下载速度。此时的sources.list包含以下阿里云的源:

复制代码
deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
复制代码

 

对于两台slave机器来说,我们只需要安装JDK即可(其他软件,比如SSH等都已经包含在ubuntu/trusty64 box中了),对两台slave执行同一份provision文件provision_slave.sh:

复制代码
#! /bin/bash
#change apt source to be inside China to speed up apt
sudo mv /etc/apt/sources.list /etc/apt/sources.list.old
sudo cp /vagrant/sources.list /etc/apt/sources.list

sudo apt-get update
#install openjdk
sudo apt-get -y install default-jdk
复制代码

 

运行“vagrant up”,在Virtualbox中将出现三台虚拟机,他们与host机器同属于一个局域网,相互可连通。

 

在host机器中打开http://192.168.2.2:8080(即Jenkins master),开始初始化配置Jenkins:

 

Jenkins要求输入初始的admin密码,密码位于文件/var/lib/jenkins/secrets/initialAdminPassword中,请注意,该文件为master机器上的文件,而不是host机上的。此时我们通过“vagrant ssh master”登录到master机器上,该文件的内容即为admin的初始密码。之后Jenkins将提示我们安装一些必要的插件,安装Jenkins推荐的插件即可,之后Jenkins还会让我们创建一个真正的admin用户,完了就可以使用Jenkins了。

 

不过此时的Jenkins master还并不知道slave机器的存在,为了能使用slave机器,我们需要将master机上用户“jenkins”的public key上传到每一台slave机器上,这里我们选择slave上的“vagrant”用户作为构建Jenkins job的用户,即我们需要先在master机器上为jenkins用户生成一对keypair,然后将public key加入到每台slave机上vagrant用户的authorised_keys文件中。这个过程是标准的SSH配置过程,请参考这里。另外,为了使master能够通过SSH连接slave,我们还需要以master机器上的jenkins用户的private key添加一个Credential,这里我们添加一个名为vagrant的Credential,采用直接输入密钥的方式填入jenkins用户的密钥:

 

在配置好了SSH之后,便可以在Jenkins中加入slave了:进入添加新node页面:

 

这里有几点需要注意,在“Romote root directory”中,必须填入“/home/vagrant”,因为这是vagrant用户拥有读写权限的目录;另外,在“Launch method”中,选择“Launch slave agents on Unix machines via SSH”,最后在Credentials中选择在先前添加的vagrant。

用Vagrant和Ansible搭建持续交付平台

随着微服务越来越被行业所接受,与之相关的持续集成和持续交付的作用和价值也更加突显。在本文中,我们将使用Vgrant和Ansible来自动地创建一套持续交付平台——ThoughtWorks的GoCD。如果你对Jenkins比较熟悉,也可以参考笔者另外一篇搭建Jenkins多机构建环境的文章。

 

 

我们将创建一台Go Server和两台Go Agent,对于不熟悉GoCD的读者来说,可以将Go Server理解成Jenkins的Master,而将Go Agent理解为Jenkins的Slave。

本文源代码:https://github.com/davenkin/vagrant/tree/master/ansible-go-server-2-agents-ubuntu1404

 

首先,创建如下Vangrantfile:

复制代码
GO_SERVER_IP="192.168.3.2"
GO_AGENT1_IP="192.168.3.3"
GO_AGENT2_IP="192.168.3.4"

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.define "server" do |server|
      server.vm.hostname = "goserver"
      server.vm.network "private_network", ip: GO_SERVER_IP
      server.vm.provider "virtualbox" do |v|
        v.name = "go-server"
        v.memory = 1024
        v.cpus = 2
      end

  end

  config.vm.define "agent1" do |agent1|
      agent1.vm.hostname = "goagent1"
      agent1.vm.network "private_network", ip: GO_AGENT1_IP
      agent1.vm.provider "virtualbox" do |v|
        v.name = "go-agent1"
        v.memory = 1024
      end

  end

  config.vm.define "agent2" do |agent2|
      agent2.vm.hostname = "goagent2"
      agent2.vm.network "private_network", ip: GO_AGENT2_IP
      agent2.vm.provider "virtualbox" do |v|
        v.name = "go-agent2"
        v.memory = 1024
      end

  end

 config.vm.provision "ansible" do |ansible|
    ansible.playbook = "ansible/playbook.yml"
    ansible.groups = {
      "servers" => ["server"],
      "agents" => ["agent[1:2]"],
      "agents:vars" => {"goserver_ip" => GO_SERVER_IP}
    }
  end

end
复制代码

 

以上,我们创建了3台虚拟机,其中Go Server的IP地址为192.168.3.2,两台Go Agent的IP地址分别为192.168.3.3和192.168.3.4。由于采用了Vagrant的private_network网络方式,这3台虚拟机以及Host机器之间都是相互连通的。在config.vm.provision配置项中,我们指定了所使用的Ansible配置文件ansible/playbook.xml,该文件将同时用于Go Server和Go Agent的provision。最后,我们声明了两个Ansible的group,一个名为servers,包含了Go Server;另一个名为agents,包含两台Go Agent。对于两台Go Agent,我们还定义了变量goserver_ip,该变量将用于配置两台Go Agent,用于指向他们需要连接的Go Server。

 

然后创建playbook.xml如下:

复制代码
---
- hosts: servers
  become: true
  become_method: sudo
  roles:
    - role: goserver
    - role: git
- hosts: agents
  become: true
  become_method: sudo
  roles:
    - role: goagent
    - role: git
复制代码

 

在该文件中,我们定义了两份playbook,一份用于配置Go Server(上文提到的servers这个group),另一份用于配置Go Agent。可以看出,该playbook本身并没有做什么配置工作,而是对于不同的group使用了不同的Ansible role——goserver、goagent和git。

 

为了引用这些role,他们需要遵循一定的目录结构,比如需要在playbook.xml所在的目录下创建一个名为roles的目录用于存放所有的role。而每个role又有自身的目录结构,比如对于goserver这个role来说,要执行的task应该放在roles/goserver/tasks/main.yml这个文件中。有关role的目录结构细节请参考Ansible的官方文档

 

这里我们将以goserver这个role为例讲解Go Server的provision过程。goserver这个role的目录包含以下内容:

复制代码
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
└── tasks
     └── main.yml
复制代码

 

首先在tasks/main.yml中,我们通过apt这个module安装了jdk和go-server:

复制代码
---
- name: install jdk
  apt: pkg=default-jdk state=present

- name: install go sever
  apt: pkg=go-server state=present
  notify:
    - start go server
复制代码

 

在安装完成之后,我们还需要保证Go Server是启动的,这个在handlers/main.yml中:

---
- name: start go server
  service: name=go-server state=started

 

对于Go Server来说,安装过程的最后一步会自动启动Go Server的service,故以上步骤其实省略也可。但是对于Go Agent来说,则不是自动启动的了。

 

另外,在meta/main.yml文件中,我们声明了goserver依赖于另一个role——apt_update:

---
dependencies:
  - { role: apt_update }

 

也就是说,在goserver运行之前,apt_update这个role会自动运行,该role主要作用是将apt源从默认的国外转成国内的阿里云,这样在安装软件时速度会更快,另外由于go-server不在阿里云源里,我们还需要手动添加go-server的源。apt_update目录如下:

├── files
│   └── sources.list
└── tasks
    └── main.yml

 

在apt_update/tasks/main.yml文件中,设置阿里云的源和go-server自己的源:

复制代码
---
- name: archieve existing sources.list
  shell: creates="/etc/apt/sources.list.old" mv /etc/apt/sources.list /etc/apt/sources.list.old

- name: copy new sources.list
  copy: src=sources.list dest=/etc/apt/ 

- name: add gocd.list
  shell: creates="/etc/apt/sources.list.d/gocd.list" echo "deb https://download.go.cd /" | sudo tee /etc/apt/sources.list.d/gocd.list

- name: add gocd apt key
  shell: curl https://download.go.cd/GOCD-GPG-KEY.asc | sudo apt-key add -

- name: update apt cache
  apt: update_cache=yes
复制代码

 

 

除了安装Go Server,我们还安装了Git,用于在构建项目时能够顺利从Git服务器(比如Github)下载到项目源代码。

对于两台Go Agent来说,也具有与Go Server相似的过程。

 

最后,运行vagrant up,我们便可以在Virtualbox中看到这3台虚拟机了:

 

然后在Host机器上打开http://192.168.3.2:8153/go/pipelines,便可以看到Go Server的页面了:

请注意,此时的两台Go Agent虽然能够正常连接Go Server,但是他们的状态却是disable的,为了正常使用Go Agent来构建项目,你需要先在Go Server中将他们enable。点击页面上方的“AGENTS”,进入agents管理也便可enable/disable所有的agents:

 

还有个问题,Ansible所需要的inventory在哪里?事实上,Vagrant会基于Vangrantfile自动为我们生成Ansible的inventory文件,并放在与Vgrantfile文件同级的.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory文件中。对于本项目,在笔者的机器上所生成的vagrant_ansible_inventory文件如下:

复制代码
# Generated by Vagrant

agent1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/agent1/virtualbox/private_key'
agent2 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/agent2/virtualbox/private_key'
server ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/yteng/github/vagrant/ansible-go-server-2-agents-ubuntu1404/.vagrant/machines/server/virtualbox/private_key'

[servers]
server

[agents]
agent[1:2]

[agents:vars]
goserver_ip=192.168.3.2

 


用 vagrant 快速部署 docker 虚拟机集群

快速部署虚拟机集群(vagrant)

快速部署虚拟机集群是开发与测试团队面临的重要任务,常见的工具是 vagrant 与 docker machine。使用 vagrant 下载网上做好的虚拟机,速度“感人”!本文介绍 vagrant 在 VirtualBox 环境下创建 CentOS 虚拟机基础 Box 的方法,以及部署 docker 集群环境的应用。

highlights:

  • 创建 CentOS Vagrant 基础 Box (CentOS 7 + docker engine + docker compose)
  • Vagrant 配置文件
  • Vagrant 管理虚拟机命令
  • 创建管理 docker 虚拟机集群

环境准备

目标:建立一个 CentOS 7 + docker engine + docker compose 虚拟机,配置成 manager1,worker1,worker2 的虚拟机集群,一键启动。

1、Vagrant 简介

Vagrant(VM a Grant Up)一键启动虚拟机。

Vagrant 的原始动机:将 VirtualBox (包括 VMWare,AWS)等建的虚拟机打一个包(box),配合Vagrantfile 配置文件,定义项目中虚拟机的 box 、主机名、网络、挂载、虚拟机启动脚本等,用一个 vagrant up 命令自动完成虚拟机软件运行环境(应用上云)。

Vagrant 原理

vagrant-arch

  1. 定义项目配置文件,Vagrantfile;
  2. vagrant up 按配置获取 box,导入虚拟机。如果本地仓库没有,到市场下载;
  3. 设置虚拟机主机名,网络,外部文件系统挂载,执行启动脚本;
  4. 通过 vagrant 管理虚拟机的启动、挂起、ssh 进入虚拟机等。

按环境准备安装,比较简单。

2、准备创建 CentOS Vagrant Base Box

虚拟机镜像大小众人皆知阿,如果没有镜像站点,下载慢不说,你需要的系统有没有合适镜像也是问题。第一步就是自己动手,建立虚拟机的 box。好在网上也有不少资料!

原版:How to Create a CentOS Vagrant Base Box

中文整理后:Vagrant之创建一个基于CentOS的Vagrant Base Box

适应范围 CentOS,Ubuntu,这里以 CentOS7 Minimal 为例。

第一步:使用 ISO 镜像安装虚拟机

  • 使用 CentOS-7-x86_64-Minimal-????.iso 在 VirtualBox 创建虚拟机

    • 虚拟机名称:centos7-docker-vagrant
    • 禁用声音与USB设备
    • 网络:默认 NAT,设置 ssh 转发路由 guestssh,协议 tcp,端口 2222 映射到端口 22
    • 创建 20G 左右虚拟盘
  • 基础安装过程注意事项

    • 开启网络
    • 记住 root 的密码

第二步:升级 CentOS

ssh 连接虚拟机

打开 Git Bush,ssh 到虚拟机,方便 copy-paste 命令。(CentOS7 内置 ssh 并启动 sshd 了!)

$ ssh -p 2222 root@127.0.0.1
  • 1

如果出现 ECDSA key fingerprint 错误,删除 ~/.ssh/known_hosts 文件中对应内容即可。

升级系统

$ yum update
$ reboot
$ yum update kernel
$ reboot

第三步:安装 virtualbox guest additions

这一步的任务是 Virtualbox 要重新构内核,以支持挂载主机的文件系统。

详细原文:CentOS 7 VirtualBox Guest Additions Installation

安装重构内核开发工具

$ yum install gcc make kernel-devel bzip2 wget
  • 1

安装 VirtualBox Guest Additions

  • 用VirtualBox 在虚拟机挂载 Guest Additions CDROM
  • 然后执行以下命令
$ cd /mnt
$ mkdir cdrom && mount /dev/cdrom /mnt/cdrom
$ cd cdrom && ./VBoxLinuxAdditions.run

执行结果如下:

[root@localhost mnt]# mkdir cdrom && mount /dev/cdrom /mnt/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost mnt]# cd cdrom && ./VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.12 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Building Guest Additions kernel modules.
vboxadd.sh: Starting the VirtualBox Guest Additions.

Could not find the X.Org or XFree86 Window System, skipping.

看到这个结果即成功拉!现在重启

$ reboot

第四步:创建 vagrant 并授权

  • 修改主机名为:centos7-docker-vagrant
nmtui

这个文本ui还是很给力的。

  • 添加用户组 admin 与用户 vagrant 并授权
$ useradd vagrant
$ passwd vagrant
密码每次都输入: vagrant
$ groupadd admin
$ usermod -G admin vagrant
  • 修改 sudoers 文件,虚拟机 root 用户使用 visudo 命令

    • Add SSH_AUTH_SOCK to the env_keep option
    • Add the line %admin ALL=NOPASSWD: ALL

这个步骤是 vagrant 登陆后,执行 sudo 命令不用输入密码,修改结果:

$ visudo
# 在 Defaults   env_keep += "HOME" 下添加
Defaults    env_keep += SSH_AUTH_SOCK
# 在root    ALL=(ALL)       ALL下添加
%admin  ALL=(ALL) NOPASSWD:   ALL
Defaults:vagrant !requiretty

更改完成后退出root,vagrant用户 ssh 登陆,并执行 sudo ls,查看是否能执行

$ ssh -p 2222 vagrant@127.0.0.1
vagrant@127.0.0.1's password:
Last login: Wed Dec 28 13:15:20 2016 from 10.0.2.2
[vagrant@centos7-docker-vagrant ~]$ sudo ls
[vagrant@centos7-docker-vagrant ~]$

如上所示,则表示配置正确.

第五步:让 vagrant ssh 无密码 ssh 连接虚拟机

$ mkdir .ssh
$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ mv vagrant.pub  .ssh/authorized_keys
$ chmod 0700 .ssh
$ chmod 0600 .ssh/authorized_keys
$ ls .ssh -l
-rw-------. 1 vagrant vagrant 409 12月 28 13:24 authorized_keys

要点 authorized_keys 有 409 个字节。

第六步:安装虚拟机上软件,如 docker 引擎等

安装 docker 引擎

$ ssh -p 2222 vagrant@127.0.0.1
vagrant@127.0.0.1's password:
Last login: Wed Dec 28 13:16:42 2016 from 10.0.2.2

务必使用 vagrant 安装测试 docker。详细参考:CentOS 7 安装 Docker。一般不需要配阿里云加速。

安装 compose

wget https://bootstrap.pypa.io/get-pip.py

详细参考:docker 集群(单主机)部署web 应用入门(Nginx)

第七步:收尾工作

$  yum clean all

最后,关闭虚拟机 shutdown -h now

3、vagrant 使用

3.1 创建 CentOS Vagrant Base Box 并放入本地仓库

在主机上输入:

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant package --output centos7-docker.box --base centos7-docker-vagrant

其中 –base 参数表示虚拟机名称, –output 表述虚拟机Box文件。

构建 box 过程输出如下:

==> centos7-docker-vagrant: Clearing any previously set forwarded ports...
==> centos7-docker-vagrant: Exporting VM...
==> centos7-docker-vagrant: Compressing package to: C:/Users/pmlpml/vagrant_getting_started/centos7-docker.box

最后,我们把 box 放进本地仓库:

$ vagrant box add centos7-docker centos7-docker.box
$ vagrant box list

3.2 配置虚拟机

centos7-docker 可以看作为虚拟机的原型,下一步就是用 Vagrantfile 定制软件环境。

创建 Vagrantfile 描述模板

$ vagrant init centos7-docker

得到虚拟机描述 Vagrantfile

Vagrant.configure("2") do |config|
  #虚拟机 box
  config.vm.box = "centos7-docker"
end

配置虚拟机

修改 Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

$vm_name = "vm1"

Vagrant.configure("2") do |config|
  # box 名称
  config.vm.box = "centos7-docker"
  # 虚拟机名(virtualbox 的专用配置)
  config.vm.provider "virtualbox" do |v|
    v.name = $vm_name
  end
  # 主机名
  config.vm.hostname = $vm_name
  # 网络
  config.vm.network "private_network", ip: "192.168.50.4", auto_config: false
  # 启动脚本
  config.vm.provision "shell", inline: <<-SHELL
    echo hello world
    echo ...
  SHELL
end

这个脚本非常简介,ruby 风格。先定义一些全集变量,然后建立一个 Vagrant 配置变量 |config|,然后定义你需要的内容,其中网络是私有网络,vagrant 会为虚拟机自动配一块 host-only 网卡,配地址 “192.168.50.4/24”。具体见官方手册。

更多重要内容包括(见官方手册):

  • ssh 配置
  • 虚拟机目录与主机目录同步配置
  • 网络配置
  • provision 配置

3.3 管理虚拟机

在 Vagrantfile 文件所在的目录,执行以下目录:

$ vagrant up  ## 启动虚拟机
$ vagrant ssh ## 不需要带任何参数,直接进入虚拟机
$ vagrant reload  ##用新配置加载启动虚拟机
$ vagrant halt  ## 关机
$ vagrant destroy ## 清除机器

3.4 创建 docker 虚拟机集群

  • 在项目目录下,创建三个子目录 vm1、vm2、vm3
  • 将前面建好的 Vagrantfile 拷贝到这些目录
  • 修改不同目录中的 Vagrantfile 的主机,ip地址配置
  • 在各目录中执行管理命令 vagrant up

事实上,用三个配置管理三台虚拟机是不必要的。一个 Vagrantfile 也可搞定。在开发阶段,简单的配置和独立的控制是绝对有价值的。如果喜欢一条命令,写个脚本就是了。

小结

vagrant 可方便实现虚拟机部署自动化与管理。使用管理非常简单,基本配置也不难,在基础的 box 上创建新 box 也容易。建立基础 box 有一定难度,要完成大规模节点的部署(包括安全)需要更好深入 Vagrant 的配置与各种插件(plugin)和应用环境(provider)。

自制Vagrant 的CentOS 7 BOX镜像

使用vagrant管理虚拟机,非常方便,可以自己经常做实验,机器也不占用资源,内存和CPU的消耗,非常低。
特别是搭建高可用环境时需要模拟高可用服务,需要不少同时运行的机器,在服务器上进行模拟实验的,vagrant不失为一种好方法。
我时候再在VirtualBox 5.1中安装CentOS 7.3 1611,镜像CentOS-7-x86_64-Minimal-1611.iso。

安装CentOS 7.3 1611

虚拟机配置

点击新建,使用专家模式

 
Paste_Image.png


然后点击创建,选择硬盘大小,建议50G,一开始并不会占用过很多,因为是动态分配,用多少物理机分配多少

 
Paste_Image.png


点击创建后,选择新虚拟机点击设置,选择存储选项卡,添加下载好的ISO镜像

 
Paste_Image.png


选择网络选项卡,这里我们多添加一块网卡,启动网络连接打钩,连接方式选择桥接网卡,界面名称选择你连路由器的那张网卡,我的是无线网卡。

 
Paste_Image.png


下面就可以保存,开机了!

 

虚拟机安装Linux系统

最小化也是有图像界面。
直接下一步

 

 
Paste_Image.png

 

这四项是需要设置的

 

 
Paste_Image.png

语言&时区

除了英文,还需要选择中文简体和繁体

 

 
Paste_Image.png

 

时区直接点击中国上海或者北京就可以了

网络

选择第二块桥接的网卡
禁IPV6,开IPV4,手动分配IP,主机名host name可以改也可以不改

 
Paste_Image.png
 
Paste_Image.png
 
Paste_Image.png

磁盘

选择自己配置分区,

 
Paste_Image.png


自动分配

 
Paste_Image.png


建议分区都使用XFS分系统,现在IO性能和安全性更好。

 
Paste_Image.png


建议右下角单独挂载一个/data分区
好了后,点击左上角DONE,然后返回上面初始图,点击Begin Installation

 

账户

设置root账户的密码,另外新建一个vagrant用户,点击高级配置,分配到wheel分组,这里就不截图了。

CentOS 7的配置

查看防火墙和SELinux

iptables -L
getenforce

确保/etc/sysconfig/network-scripts/下面的网卡配置的onboot=yes
升级源,建议最好换国内的源
具体细节就不贴了

#先按照wget
[root@tzfmysql ~]# yum install wget -y
#使用阿里的源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@tzfmysql ~]# yum makecache
[root@tzfmysql ~]# yum upgrade -y
[root@tzfmysql ~]# yum install vim -y

此步骤个人爱好,不是必须的

yum install zsh,git -y
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

关闭防火墙,邮件服务,SElinux

~ systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.

~ systemctl disable postfix.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/postfix.service.

vim /etc/sysconfig/selinux
#修改一下代码
SELINUX=disabled

安装kernel-devel,需要安装VBOX的增强包,就必须安装这个

~ yum install kernel-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package kernel-devel.x86_64 0:3.10.0-514.26.2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch         Version                    Repository     Size
================================================================================
Installing:
 kernel-devel       x86_64       3.10.0-514.26.2.el7        updates        13 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 13 M
Installed size: 34 M
Is this ok [y/d/N]: y

#GCC
~ yum groupinstall Development Tools -y
#安装rz方便上传增强包
~ yum install lrzsz -y
rz

然后在VOBX的安装目录下上传VBoxGuestAdditions.iso

 

 
Paste_Image.png

安装增强包

➜  ~ mv VBoxGuestAdditions.iso /data
➜  ~ cd /data
➜  /data ls
VBoxGuestAdditions.iso
➜  /data mount -o loop VBoxGuestAdditions.iso /media/
mount: /dev/loop0 is write-protected, mounting read-only
➜  /data cd /media 
➜  /media
➜  /media ls
32Bit        cert                    VBoxSolarisAdditions.pkg
64Bit        OS2                     VBoxWindowsAdditions-amd64.exe
AUTORUN.INF  runasroot.sh            VBoxWindowsAdditions.exe
autorun.sh   VBoxLinuxAdditions.run  VBoxWindowsAdditions-x86.exe

➜  /media ./VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.22 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.
#卸载增强包
➜  unmout /media
➜  /media yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base extras updates
Cleaning up everything
Cleaning up list of fastest mirrors

Vagrant Box 打包

vagrant安装

vagrant的安装很简单,直接看官方文档即可,这里就不复述了。

权限配置公钥

为vagrant添加sudo权限

vim /etc/sudoers
%wheel    ALL=(ALL)    NOPASSWD: ALL
#添加ssh的
~ cd ~vagrant/
~vagrant cd .ssh/
~vagrant ls -al
~vagrant mkdir .ssh
~vagrant cd .ssh/
.ssh wget https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub
--2017-08-06 22:25:31--  https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub
Resolving github.com (github.com)... 192.30.255.113, 192.30.255.112
Connecting to github.com (github.com)|192.30.255.113|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘vagrant.pub’

    [         <=>                                                   ] 98,894      44.5KB/s   in 2.2s   
~ cat vagrant.pub >authorized_keys
➜  .ssh ll
total 100K
-rw-r--r-- 1 root root 97K Aug  6 22:25 vagrant.pub
➜  .ssh chmod 600 *
➜  .ssh ll
total 100K
-rw------- 1 root root 97K Aug  6 22:25 vagrant.pub
➜  .ssh cd ..
➜  ~vagrant ls
➜  ~vagrant ll
total 0
➜  ~vagrant ls -al
total 12
drwx------. 3 vagrant vagrant  74 Aug  6 22:24 .
drwxr-xr-x. 3 root    root     21 Aug  6 20:10 ..
-rw-r--r--. 1 vagrant vagrant  18 Aug  3  2016 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 Aug  3  2016 .bash_profile
-rw-r--r--. 1 vagrant vagrant 231 Aug  3  2016 .bashrc
drwxr-xr-x  2 root    root     25 Aug  6 22:25 .ssh
➜  ~vagrant chown vagrant:vagrant .ssh
➜  ~vagrant ll
total 0
➜  ~vagrant ls -al
total 12
drwx------. 3 vagrant vagrant  74 Aug  6 22:24 .
drwxr-xr-x. 3 root    root     21 Aug  6 20:10 ..
-rw-r--r--. 1 vagrant vagrant  18 Aug  3  2016 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 Aug  3  2016 .bash_profile
-rw-r--r--. 1 vagrant vagrant 231 Aug  3  2016 .bashrc
drwxr-xr-x  2 vagrant vagrant  25 Aug  6 22:25 .ssh
➜  ~vagrant chmod 700 .ssh
➜  ~vagrant ls -al
total 12
drwx------. 3 vagrant vagrant  74 Aug  6 22:24 .
drwxr-xr-x. 3 root    root     21 Aug  6 20:10 ..
-rw-r--r--. 1 vagrant vagrant  18 Aug  3  2016 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 Aug  3  2016 .bash_profile
-rw-r--r--. 1 vagrant vagrant 231 Aug  3  2016 .bashrc
drwx------  2 vagrant vagrant  25 Aug  6 22:25 .ssh
➜  ~vagrant cd .ssh
➜  .ssh ll
total 100K
-rw------- 1 root root 97K Aug  6 22:25 vagrant.pub

配置网卡

此步骤时候我很郁闷的一步,就是当你直接把这个镜像打包后,以后如果在同一台机器上面使用同一个box虚拟多台机器,配置就会出问题。因此这步骤还是比较关键的

#第一步:把网卡中的MAC地址注释
#HWADDR=XX:XX------------
#第二步:删除
rm -rf /etc/udev/rules.d/70-persistent-ipoib.rules
#安装新的虚拟机后,建议改一下MAC地址,如果还遇到其他问题,建议看看这里
#虚拟机克隆CentOS7 出现的网络问题解决办法http://www.bubuko.com/infodetail-1483490.html
poweroff

打包BOX

#进入vagrant的目录
vagrant package --output ./tzfcentos73.box --base CentOS73
[E:\vagrant]$ vagrant package --output ./tzfcentos73.box --base CentOS73
==> CentOS73: Exporting VM...
==> CentOS73: Compressing package to: E:/vagrant/tzfcentos73.box
#解释output是指box的名字,--base是指基于VBOX里面的哪个虚拟机打包,这的名字一定要争取
posted @ 2021-04-02 15:57  CharyGao  阅读(569)  评论(0)    收藏  举报