zoukankan      html  css  js  c++  java
  • 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文件,这个文件包括自动化虚拟机的所有设置

    方式1init自动生成后修改

    如下例,从已发布的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://stackoverflow.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

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

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

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

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

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

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

    参考

    devops-cdvagrant virtualbox实战 https://www.yuque.com/wushifengcn/kb/qo3kmu 

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

  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/2018/p/14622449.html
Copyright © 2011-2022 走看看