• 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 

  • 相关阅读:
    python复制图片到系统剪切板
    windows 下使用 conda activate 异常
    pandas date_range freq 可选值
    aidlearning aidlux
    python round 四舍五入踩坑
    将JavaBean对象转换为Map集合
    Python输出日志信息
    Feign实现文件上传下载
    常用工具集汇总
    如何对Spring MVC中的Controller进行单元测试
  • 原文地址:https://www.cnblogs.com/2018/p/14622449.html
Copyright © 2020-2023  润新知