devops-cd之vagrant virtualbox实战

目录

概要 1

安装 1

vagrant 1

vagrant插件的安装 2

Provider 2

Virtualbox安装 3

Virtualbox box镜像 3

Vagrantfile编写 4

Vagrantfile例子 4

virtualbox的例子 4

vmware的例子 5

常用命令 6

Tip 7

 

概要

vagrant virtualbox的操作的基础

本机需要安装virtualbox软件和相关依赖,vagrant通过编写的工程文件来自动化控制virtualbox,来完成虚拟机的创建、运行、销毁等系列的事情

运行时,把box文件导入到本机的约定目录下,然后基于该box建立和工程配置一致的虚拟机实例【virtualbox实例】

guest虚拟机中默认配置好了免密的用户,因此可以登录虚拟机进行管理等操作

 

基于这些自动化的虚拟机,可以快速的进行分布式的系统验证,持续部署等场景

安装

vagrant

yum install -y vagrant.x86_64

 

vagrant的智能提示安装

#vagrant https://github.com/hashicorp/vagrant/tree/master/contrib/bash

sudo cp -f vagrant* /etc/bash_completion.d/.

TAB提示例子

$ vagrant

box            docker-exec    halt           login          push           rsync          ssh            up

cloud          docker-logs    help           package        rdp            rsync-auto     ssh-config     version

connect        docker-run     init           plugin         reload         share          status         

destroy        global-status  list-commands  provision      resume         snapshot       suspend

$ vagrant version

==> vagrant: A new version of Vagrant is available: 2.2.15 (installed version: 2.2.9)!

==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

 

Installed Version: 2.2.9

Latest Version: 2.2.15

vagrant插件的安装

# --plugin-clean-sources --plugin-source 设置后在 ~/.vagrant.d/plugins.json 这里就会保存了安装源地址

#https://github.com/devopsgroup-io/vagrant-hostmanager

vagrant plugin install --plugin-clean-sources --plugin-source ${REPO_GEMS} --debug vagrant-hostmanager

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

vagrant plugin install --plugin-clean-sources --plugin-source ${REPO_GEMS} --debug vagrant-vbguest

# https://github.com/sprotheroe/vagrant-disksize config.disksize.size = '50GB'

vagrant plugin install --plugin-clean-sources --plugin-source ${REPO_GEMS} --debug vagrant-disksize

 

安装插件后,就可以在Vagrantfile中设置对应扩展需要的一些配置,没有插件的话,可以设置基本的配置

Provider

https://www.vagrantup.com/docs/providers 参考官方说明

支持 VirtualBox, Hyper-V, and Docker,  Vmware等

Virtualbox安装

【yum的安装源地址 http://download.virtualbox.org/virtualbox/rpm/rhel/ 】

#virtualbox yum search VirtualBox --showduplicates

# 6.1以后支持虚拟机内虚拟化【可以在virtualbox虚拟机中安装virtualbox 或kvm 测试验证等可用】

# yum remove VirtualBox-6.0.x86_64

yum install -y VirtualBox-6.1-6.1.12_139181_el7-1.x86_64

# Virtualbox 安装

 

vbox-extpack 从官网下载 https://www.virtualbox.org/wiki/Downloads 

VBoxManage extpack install --accept-license=56be48f923303c8cababb0bb4c478284b688ed23f16d775d729b89a2e8e5f9eb --replace Oracle_VM_VirtualBox_Extension_Pack-6.1.12-139181.vbox-extpack

 

详细的virtualbox安装参考 

https://www.virtualbox.org/manual/ch02.html#install-linux-host

Virtualbox box镜像

centos的光放提供的镜像

http://cloud.centos.org/centos/7/vagrant/x86_64/images/

 

box镜像导入后,会在本机的~/.vagrant.d/boxes/目录下保存,box文件可以从http ftp或者本地等处导入

 

镜像的一般约定:

默认包含 vagrant/vagrant 用户账号,并且可以sudo提权操作;可以使用vagrant产品的公开的秘钥免密登录

【注意:如果有的box没有安装Guest Addtion, vagrant up启动时会自动提示进行安装,如果自动安装失败,可以参考如下手动安装

#这些编译编译依赖必须在

yum groupinstall -y "Development Tools"

#内核的头文件和开发包

rpm -ivh /opt/dev/tools/rpm/*.rpm --force

EOF

 

mount -o loop /opt/dev/tools/virtualbox/VBoxGuestAdditions_6.1.12.iso /mnt

pushd mnt

 ./VBoxLinuxAdditions.run

popd

 

:<<EOF

最终会多出来vboxguest

# lsmod |grep vbox

vboxnetadp             25813  0

vboxnetflt             27959  1

vboxdrv               497658  4 vboxnetadp,vboxnetflt

vboxguest             349020  1

EOF

 

安装这个后,guest机器和主机就可以共享文件了,默认启动是会把host机器的当前目录挂载到guest机器的/vagrant目录下,基于这个目录,两个机器就可以共享内容了

Vagrantfile编写

vagrant只认当前目录下的Vagrantfile文件,这个文件包括自动化虚拟机的所有设置

方式1:init自动生成后修改

如下例,从已发布的box镜像初始化

vagrant init centos7.4 "http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1708_01.VirtualBox.box"

方式2:手工编写

按照其语法编写即可

 

这些编写的Vagrantfile文件可以受控起来,作为版本控制【IaC】

Vagrantfile例子

virtualbox的例子

# -*- mode: ruby -*-

# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

 

Vagrant.configure("2") do |config|

    #key目录下的秘钥文件

    #config.vm.provision "file", source: "key/id_rsa.pub", destination: "/home/vagrant/.ssh/authorized_keys"

    config.ssh.private_key_path = ["key/id_rsa"]

    config.ssh.forward_agent = true

    config.ssh.insert_key = false

 

    #私服配置等设置项文件

    config.vm.provision "file", source: "post.sh", destination: "/home/vagrant/post.sh"

    #拷贝的脚本统一执行一次

    config.vm.provision :shell, inline: "chmod +x /home/vagrant/post.sh; sudo /home/vagrant/post.sh"    

    config.vm.boot_timeout = 1000

    

    #

    config.vm.define "centos7.4-vb" do |node|

        node.vm.hostname = "vb1"

 

        #box需要按照格式备好

        node.vm.box = "centos-cert-user-7.4"

node.vm.box_url = "http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1708_01.VirtualBox.box"

        node.vm.box_check_update = false

 

        #node.vm.synced_folder '.', '/vagrant', :disabled => true

        node.vm.network "private_network", ip: "192.168.99.200"

 

        #https://www.vagrantup.com/docs/providers/virtualbox/configuration 具体的配置项

        node.vm.provider :virtualbox do |vb|

            #   vb.gui = true

            vb.memory = 1024

            vb.cpus = 1

            vb.name = "vb1"

        end

    end

end

vmware的例子

# -*- mode: ruby -*-

# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'vmware_esxi'

 

nodes = {

   "vm-multi1" => ["hashicorp/precise64", 1, 1024, 21 ],

   "vm-multi2" => ["generic/centos7",     2, 2048, 22 ],

}

 

Vagrant.configure(2) do |config|

  nodes.each do | (name, cfg) |

    box, numvcpus, memory, storage = cfg

 

    config.vm.define name do |machine|

      machine.vm.box   = box

      machine.vm.hostname = name

      machine.vm.synced_folder('.', '/Vagrantfiles', type: 'rsync')

 

      machine.vm.provider :vmware_esxi do |esxi|

        esxi.esxi_hostname         = 'esxi'

        esxi.esxi_username         = 'root'

        esxi.esxi_password         = 'file:'

        esxi.esxi_virtual_network  = "VM Network"

        esxi.guest_numvcpus        = numvcpus

        esxi.guest_memsize         = memory

        esxi.guest_storage         = storage

        #esxi.clone_from_vm        = box

        esxi.local_allow_overwrite = 'True'

 

      end

    end

  end

end

 

如上文件依赖插件vagrant-vmware-esxi

vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ vagrant-vmware-esxi

https://www.vagrantup.com/docs/providers/vmware/installation 这个使用需要独立的授权,需要单独购买

常用命令

在Vagrantfile的目录下的SHELL中

开机:vagrant up

关机:vagrant halt

看状态: vagrant status

登录: vagrant ssh 

销毁: vagarant destroy -f

遇到问题时:如上的命令行加--debug可以看详细的诊断信息,可以辅助排错

 

对虚拟机的远程操作例子

IP=10.10.10.10

scp -o StrictHostKeyChecking=no -i ~/.vagrant.d/insecure_private_key custom.sh vagrant@${IP}:/tmp/.

ssh -x -o StrictHostKeyChecking=no -i ~/.vagrant.d/insecure_private_key vagrant@${IP} "/tmp/custom.sh"

 

ssh -xv 可以诊断连接过程的信息,可以用于排错

Tip

Ø 如何做自己的box

n 方式1:按照约定一步步的安装,具体执行检索, https://www.vagrantup.com/docs/boxes/base 

n 方式2:使用packer创建,这里有个例子https://github.com/boxcutter/centos 

n 方式3:官网下载,如centos http://cloud.centos.org/centos/7/vagrant/x86_64/images/ 或者 https://app.vagrantup.com/boxes/search 上找

Ø Vagrantfile

n 这个文件是基于ruby语法的,因此可以编程处理一些场景,https://github.com/oraclebase/vagrant/blob/master/rac/ol7_19/dns/Vagrantfile 

n 如何传递变量

https://*.com/questions/14124234/how-to-pass-parameter-on-vagrant-up-and-have-it-in-the-scope-of-vagrantfile/31070025#31070025

Ø vscode Vagrantfile语法插件

https://marketplace.visualstudio.com/items?itemName=marcostazi.VS-code-vagrantfile

Ø 网络

n 默认不配置虚拟机的ip的话,guest虚拟机使用的nat网络模式,此时vagrant ssh访问的是在HOST机器上映射的端口【vagrant ssh-config可以查看信息】

n 如果配置ip,并对虚拟机指定了名字,启动时,会在/etc/hosts中自动的增加机器名字的解析,因此vagrant ssh machineName时就可解析到ip

n 网络是个比较复杂的实现,和主机等机器的互通,依赖于主机的vboxnet*这样的虚拟网卡进行网络包的映射和中转

Ø 嵌套虚拟化:在virtualbox虚拟机能否再启动虚拟机,原始上可以,但性能慢,有的场景速度不可忍受

n virtualbox6.1以后支持虚拟机内虚拟化,使用如下指令检查是否可以支持;VT是否启用了

u egrep --color -i "svm|vmx" /proc/cpuinfo

n 没有启用的话,使用这个命令启用

u $ vboxmanage modifyvm "centos7.4" --nested-hw-virt on

 

参考

devops-cd之vagrant virtualbox实战 https://www.yuque.com/wushifengcn/kb/qo3kmu 

devops-hasicorp产品图 https://www.yuque.com/wushifengcn/kb/bbvrtw 

 

上一篇:Win10使用SSH工具Finalshell连接VirtualBox虚拟机(CentOS7)


下一篇:centos7安装使用vagrant