目录
概要 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 如何传递变量
Ø vscode Vagrantfile语法插件
n 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