以前,我在自己的电脑上安装一台centos虚拟机的步骤应该是:
下载对应的ISO文件。用virtualbox或者vmware加载ISO。然后启动虚拟机,需要配置磁盘分区、网络、用户、需要的安装包等引导。配置完成之后,需要等待挺长时间来安装虚拟机。然而,vagrant安装一台centos的虚拟机,仅需要2个命令,大概30S就可以安装完成了(第一次需要下载镜像,时间会长一点,取决于网速)。
三、简单安装一台centos安装virtualbox安装就不演示了,安装完成后需要修改一下虚拟机的默认路径,不然都会存到C盘。点击工具->全局设定:
安装vagrant去vagrant官网下载最新版的软件,安装到自己制定的目录即可。然后打开cmd界面输入echo %PATH%命令,查看vagrant有没有添加到环境变量中。如果没有添加,则右键桌面的我的电脑->高级系统设置->环境变量->系统变量->Path->编辑:
配置vagrant创建虚机需要先下载镜像文件,也就是 box,它们默认存储的位置在用户目录下的 .vagrant.d 目录下,对于 Windows 系统来说,就是 C:\Users\用户名\.vagrant.d。
如果后续可能会用到较多镜像,或者你的 C 盘空间比较紧缺,可以通过设置环境变量 VAGRANT_HOME 来设置该目录。
在 Windows 系统中,可以这样操作:右键桌面的我的电脑->高级系统设置->环境变量->新建, 环境变量名为 VAGRANT_HOME,变量值为 D:\VirtualBox\.vagrant.d。
安装centos我在D盘新建了一个vagrantDemo目录,然后启动powershell进入到这个目录。
PS D:\vagrantDemo> vagrant.exe init generic/centos7PS D:\vagrantDemo> vagrant.exe up --provider=virtualboxvagrant.exe init generic/centos7这个命令会生成一个Vagrantfile配置文件。命令中的generic/centos7指定了Box的名字,可以在Vagrant Cloud网站上查看所有的Box文件。vagrant.exe up --provider=virtualbox这个命令会直接启动虚拟机,首次启动会从Vagrant Cloud上下载Box,之后启动就不需要下载了。provider指定了虚拟化的软件,vagrant给我们提供了virtualbox、hyperv、vmware_desktop、docker等,甚至可以通过编写插件来自定义这个变量。安装完成后,可以使用下面的命令查看虚拟机的状态:
PS D:\vagrantDemo> vagrant.exe statusCurrent machine states:default running (virtualbox)因为我们没有指定虚拟机的名字,所以default就是它的默认名字。
四、给虚拟机指定名字我们要修改2处名字:
virtualbox中虚拟的名字,也就是上面这串vagrantDemo_default_1622444842750_1575。vagrant status或vagrant global-status命令中显示的name,它们默认都是default直接修改Vagrantfile:
Vagrant.configure("2") do |config| config.vm.box = "generic/centos7" config.vm.define "centos7" #修改status命令中的name config.vm.provider :virtualbox do |vb| vb.name = "dev_centos7" #修改virtualbox中的name endend重新创建虚拟机,名字就变成我们指定的名字了。
五、常用管理命令获取状态的命令:PS C:\Users\zhuhf> vagrant.exe global-statusid name provider sta金融基础知识te directory------------------------------------------------------------------------d7a8468 default virtualbox running D:/testDemo2ea7a424 centos7 virtualbox running D:/vagrantDemoPS C:\Users\zhuhf> cd D:\vagrantDemo\PS D:\vagrantDemo> vagrant.exe statusCurrent machine states:centos7 running (virtualbox)vagrant.exe global-status可以在任意目录中运行,并可以获取到vagrant管理的所有虚拟机的id、name、provider、state和directory。
vagrant.exe status只可以格宾石笼护坡获取当前目录中的Vagrantfile所管理的虚拟机。
暂停、恢复和重启vagrant suspend [name|id] #暂停虚拟机vagrant resume [name|id] #将虚拟机从暂停状态中唤醒vagrant halt [name|id] #关闭虚拟机vagrant reload [name|id] #重启虚拟机vagrant up [name|id] #启动虚拟机上述命中,name和id都可以使用global-status查看,也可以不指定。要注意的是,这些命令都必须在Vagrantfile所在的目录执行。
虚拟机快照vargant list #列出已有的快照vargant delete [vm-name] snap-name #删除快照vargant push [vm-name] #创建一个快照vargant pop [vm-name] #恢复到最近一个快照并删除该快照vargant save [vm-name] snap-name #创建一个快照,并指定快照名称vargant restore [vm-name] snap-name #恢复到指定的快照push和save的作用差不多(都是保存快照),如果不需要指定快照名字的话,push更快捷一点而已。
Warning: If you are using push and pop, avoid using save and restore which are unsafe to mix.push和pop是一对,save和restore是一对,建议不要混用。
#生成2个快照D:\vagrantDemo> vagrant.exe snapshot push==> centos7: Snapshotting the machine as 'pu商品资源网sh_1622453395_8478'...PS D:\vagrantDemo> vagrant.exe snapshot push==> centos7: Snapshotting the machine as 'push_1622453410_9418'...PS D:\vagrantDemo> vagrant.exe snapshot list==> centos7:push_1622453395_8478push_1622453410_9418PS D:\vagrantDemo> vagrant.exe snapshot pop #恢复到最近一个快照, 然后删除该快照并重启PS D:\vagrantDemo> vagrant.exe snapshot pop --no-delete #不删除快照#生成2个快照PS D:\vagrantDemo> vagrant.exe snapshot save centos7行政拘留 centos_snap_1==> centos7: Snapshotting the machine as 'centos_snap_1'...PS D:\vagrantDemo> vagrant.exe snapshot save centos7 centos_snap_2==> centos7: Snapshotting the machine as 'centos_snap_2'...PS D:\vagrantDemo> vagrant.exe snapshot list==> centos7:centos_snap_1centos_snap_2PS D:\vagrantDemo> vagrant.exe snapshot restore centos_snap_2 #恢复快照并重启六、虚拟机网络端口转发PS D:\vagrantDemo> vagrant.exe up ........==> centos7: Clearing any previously set forwarded ports...==> centos7: Clearing any previously set network interfaces... centos7: Adapter 1: nat==> centos7: Forwarding ports... centos7: 22 (guest) => 2222 (host) (adapter 1) ......... PS D:\vagrantDemo> netstat -ano | findstr "2222" TCP 127.0.0.1:2222 0.0.0.0:0 LISTENING 25004默认情况下,vagrant已经给我们做了一个NAT网络,并做了端口转发,以便我们可以通过vagrant ssh命令进入到虚拟机的shell中。由于监听在127.0.0.1上,所以只能本机赵桂荣访问。
#查看端口转发PS D:\vagrantDemo> vagrant.exe port centos7 22 (guest) => 2222 (host)#进入到虚拟机shell中PS D:\vagrantDemo> vagrant.exe sshLast login: Wed Jun 2 08:46:41 2021 from 10.0.2.2[vagrant@centos7 ~]$在Vagrantfile可以通过config.vmwork "forwarded_port"来配置端口转发,可以配置的属性如下:
guest #指定虚拟机的端口host #指定宿主机的端口guest_ip #指定虚拟机的IP地址,默认为空host_ip #指定宿主机的IP地址,默认为空protocol #指定协议 tcp udp,默认tcpid#指定端口转发的名字,默认协议+虚拟机端口号,如tcp80auto_correct #当端口被占用,自动分配其他可用端口,通过config.vm.usable_port_range指定端口范围,默认false接着上面的文件,继续修改一下
Vagrant.configure("2") do |config| config.vm.box = "generic/centos7" config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "tcp", id: "tcp_554_forward", auto_correct: true config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "udp", id: "udp_554_forward" config.vm.usable_port_range = 8000..8999 config.vm.define "centos7" config.vm.provider :virtualbox do |vb| vb.name = "dev_c乐从家具城entos7" end end配置完成以后,执行vagrant reload重启虚拟机,然后查看一下配置时候生效:
PS D:\vagrantDemo> netstat -ano | findstr "2222 | 8554" TCP 0.0.0.0:8554 0.0.0.0:0 LISTENING 24512 TCP 127.0.0.1:2222 0.0.0.0:0 LISTENING 24512 UDP 0.0.0.0:8554 *:* 24512打开Virtua逗鱼时刻lbox选中这台虚拟机,点击设置->网络->高级->端口转发,看到刚刚设置的名字已经生效。
私有网络vagrant为virtualbox配置的private_network,其本质是将虚拟机加入到了virtualbox的host-only网络内。
Vagrant.configure("2") do |config| config.vm.box = "generic/centos7" config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "tcp", id: "tcp_554_forward", auto_correct: true config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "udp", id: "udp_554_forward" config.vm.usable_port_range = 8000..8999 #私有网络 config.vmwork "private_network", type: "dhcp" #config.vmwork "private_network", ip: "192.168.8.88" #也可以配置静态IP config.vm.define "centos7" config.vm.provider :virtualbox do |vb| vb.name = "dev_centos7" end end配置完成以后,执行vagrant reload重启虚拟机。从日志可以看出来,多了一个host-only的网络适配器。
PS D:\vagrantDemo> vagrant.exe reload ......==> centos7: Preparing network interfaces based on configuration... centos7: Adapter 1: nat centos7: Adapter 2: hostonly==> centos7: Forwarding ports... centos7: 554 (guest) => 8554 (host) (adapter 1) centos7: 554 (guest) => 8554 (host) (adapter 1) centos7: 22 (guest) => 2222 (host) (ad商标权质押apter 1) ......virtualbox会在宿主机上新建一个host-only网卡(在virtualbox界面设置->网络可以查看到),如果有多个网段的话,virtualbox会创建多个host-only网卡。我电脑上有个192.168.8.0网段的,这次又加了一个网卡,所以我有2张host-only网卡。
相同网段的N台虚拟机连接的是同一个host-only网卡,所以这些虚拟机之间也是可以相互通信的。
公有网络vagrant为virtualbox配置的public_network,其本质是将虚拟机桥接到了宿主机的网卡上。
Vagrant.configure("2") do |config| config.vm.box = "generic/centos7" config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "tcp", id: "tcp_554_forward", auto_correct: true config.vmwork "forwarded_port", guest: 554, host: 8554, protocol: "udp", id: "udp_554_forward" config.vm.usable_port_range = 8000..8999 #私有网络 config.vmwork "private_network", type: "dhcp" #config.vmwork "private_network", ip: "192.168.8.88" #也可以配置静态IP #公有网络 config.vmwork "public_network" config.vm.define "centos7" config.vm.provider :virtualbox do |vb| vb.name = "dev_centos7" end end配置完成以后,执行vagrant reload重启虚拟机。从日志可以看出来,又多了一个bridge的网络适配器。
PS D:\vagrantDe桃山时代mo> vagrant.exe reload ........==> centos7: Preparing network interfaces based on configuration... centos7: Adapter 1: nat centos7: Adapter 2: hostonly centos7: Adapter 3: bridged==> centos7: Forwarding ports... centos7: 554 (guest) => 8554 (host) (adapter 1) centos7: 554 (guest) => 8554 (host) (adapter 1) centos7: 22 (guest) => 2222 (host) (adapter 1) ........vagrant会默认桥接到宿主机的一张网络上。但是从上面的网卡截图里可以看到,我这台宿主机有2张无线网卡,如果我想让它桥接到我指定的网卡上,可以这样写:
config.vmwork "public_network", bridge: "Realtek 8811CU Wireless LAN 802.11ac USB NIC"#或者下面这样,如果第一个网卡可用,就桥接这个网卡。如果第一个不可用,就尝试桥热力学接第二个网卡。就这样依次往后推。config.vmwork "public_network", bridge: [ "Realtek 8811CU Wireless LAN 802.11ac USB NIC", "Intel(R) Wi-Fi 6 AX201 160MHz",]bridge后面指定的网卡名字一定要精确匹配。可以在网络适配器界面右键网卡->属性就可以看到这张网卡的名字了。
小结:vagrant默认会给虚拟机添加一个NAT网卡,NAT网络外部的主机是无法直接访问内部主机的,所以vagrant默认会做一个宿主机2222端口到虚拟机22端口的端口映射,这样就可以通过访问宿主机的2222端口,连接到虚拟机了。私有网络本质上就是一个virtualbox的host-only网络,只有宿主机才可以访问。同一网段的N台虚拟机可以通过host-only网络玻纤互相通信。公有网络本质上就是virtualbox做了一个宿主机物理网卡的桥接。如果配置了bridge字段并且该网卡不可用,则vagrant会出现交互界面,让用户选择当前可用的物理网卡进行桥接。七、使用ssh模拟终端公私钥的方式vagrant ssh命令是可以直接进入到虚拟机shell中,使用起来也非常方便。但是在window环境中,我们已经习惯去使用xShell、MobaXterm等模拟终端工具。要使用模拟终端肯定是希望虚拟机有固定的IP和端口,但是默认的NAT网卡端口转发到2222端口,如果有多台虚拟机,只有第一台可以转发到2222端口,其他的会被vagrant进行分配,这肯定是我们不想遇到的,所有我增加了一个固定IP地址的私有网络。
config.vmwork "private_network", ip: "192.168.8.101"vagrant默认是使用公私钥的方式进行免密登录的,所有查看一下ssh配置:
PS D:\vagrantDemo> vagrant.exe ssh-configHost centos7 HostName 127.0.0.1 Us信任危机er vagrant Port 2200 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile D:/v万物一体agrantDemo/.va法律基本知识grant/machines/centos7/virtualbox/private_key IdentitiesOnly yes LogLevel FATAL用模拟终端找到这个private_key就可以连接到主机了。
用户名密码的方式默认情况下,是否可以用用户名密码方式登录,取决于下载的box。比如config.vm.box = "generic/centos7"默认就不可以,config.vm.box = "generic/ubuntu1804"默认就是可以的。修改/etc/ssh/sshd_config文件把PasswordAuthentication no这一行注释掉,或者改成yes就可以密码方式登录了。
小结说说我一开始对config.ssh.username、config.ssh.password这2个字段的误解吧,我原以为我指定了这2个字段,vagrant会给我创建一个用户并设置密码,然后我就可以用我指定的用户和密码登录了。后来尝试了多次,查阅了官方文档,才知道了真相。系统默认的用户vagrant和密码vagrant是制作box的时候预创建的。如果想用自定义的用户有几个方式:
安装完成后,自己去创建帐号(哈哈,废话)。用Shell Provisioner,完成虚拟机创建的时候会执行自定义的脚本,可以在脚本里创建用户(后面会说)。自己创建完帐号后,制作一个自己的box,以后就可以用自己的用户了(后面会说)。所以,从Cloud上下载的公有box,就不要尝试使用这2个字段了,使用了反而登录不了系统。
八、文件同步如果是仅仅用vscode写代码的话,可以不用这个vagrant的文件同步,因为vscode的remote develop可以直接连接到虚拟机,并修改直接虚拟机中代码。既然vagrant提供了这个功能,也是有其他用途的。
config.vm.synced_folder "../syncFolder", "/vagrant", owner: "vagrant", group: "vagrant", id: "vb_sync"../syncFolder是宿主机的目录,/vagrant是虚拟机的目录,这个目录必须是绝对路径。在虚拟机中执行mount命令:
[vagrant@centos7 ~]$ mountvb_sync on /vagrant type vboxsf (rw,nodev,relatime) .......对于virtualbox,这是一种默认的同步类型。vagrant还支持其他几种类型:
nfs:window宿主机是不能使用这种类型的,所以我没测试过。smb:据官网介绍,smb的性能比virtualbox默认的方式要好。我试了一下,但是因为我的主机加入了域,没有管理员权限,所以没成功。rsync:默认虚拟机启动时同步一次,而且它是单向同步(只能从宿主机往虚拟机中同步)。可以执行vagrant rsync临时进行一次同步,或者执行vag索引图像rant rsync-auto使得目录出现变化时自动同步。是不是感觉这种同步方式有点鸡肋。官方文档也说了,可以在其他同步机制都不可用的情况下,可以考虑用这种方式。config.vm.synced_folder "../syncFolder", "/vagrant", owner: "vagrant", group: "vagrant", type: "rsync"九、provisioner功能从Cloud上下载的公有box,其中的配置都是默认的或对方配置的,这些配置可能并不适合每个人。所以vagrant给用户提交了provisioner,以便用户对虚拟机进行修改和定制。
vagrant给用户提供了很多种provisioner,比如shell、file、ansible、docker、 puppet、podman等等,具体可以到官网provisioning界面查看。这里就写一下shell和file吧,其他可以参照官网自行研究。
至于什么时候会执行provisioner,可以参照下面这个表格:
命令oncealwaysnevervagrant up(首次创建)执行执行不执行vagrant (up|reload)(启动或重启,非首次创建)不执行执行不执行vagrant (up|reload) --provision执行执行不执行vagrant (up|reload) --no-provision不执行不执行不执行vagrant provision执行执行不执行vagrant (up|reload|provision) --provision-with [id |name]执行执行执行--provision-with [id |name]需要解释一下:如果存在多个provisioner,只有被指定了的provisioner才会执行,其他不会被执行。
Shell Provisioner在ssh模拟终端那一节写到,可以用Provisioner去创建自定义用户,这里我们就实现一下。首先,我在Vagrantfile的同级目录下创建了一个名为adduser.sh的脚本,脚本内容如下:
#! /bin/bashusername=zhuhuifengpassword=12345id ${username} >& /dev/null && echo "user exist" && exit 1useradd ${username} >& /dev/null && echo ${password} | passwd --stdin ${username} >& /dev/null && sed -i 's/^PasswordAuthentication/#PasswordAuthentication/g' /etc/ssh/sshd_config &&systemctl re桂花香水start sshd &&echo "user add success" && exit 0echo "user add fail" && exit 1config.vm.provision "user", type: "shell", path: "adduser.sh", run: "once"然后在Vagrantfile中加入上面这行配置就搞定了。第一个user是设置这个provision的名字为user。
File Provisionerconfig.vm.provision "fileProvision", type: "file", source: "adduser.sh", destination: "$HOME/adduser.sh", run: "once"很简单,一句话就搞定了。这样会把adduser.sh脚本上传到vagrant用户的家目录下。这个操作本质上就是以vagrant用户执行了一次scp,所以这里的$HOME是vagrant用户的家目录。
二者结合使用也许有人不想把用户名密码固定在shell脚本中,那我们再修改一下脚本,从Vagrantfile中传参数给脚本,把用户名和密码配置在Vagrantfile中。首先修改一下脚本:
#! /bin/bashid ${1} >& /dev/null && echo "user exist" && exit 1useradd ${1} >& /dev/null && echo ${2} | passwd --stdin ${1} >& /dev/null && sed -i 's/^PasswordAuthentication/#PasswordAuthentication/g' /etc/ssh/sshd_config &&systemctl restart sshd &&echo "user add success" && exit 0echo "user add fail" && exit 1config.vm.provision "fileProvision", type: "file", source: "adduser.sh", destination: "$HOME/adduser.sh", run: "once"config.vm.provision qgc34;user", type: "shell", run: "once", after: "fileProvision" do |s| s.inline = "/bin/bash /home/vagrant/adduser.sh $1 $2" s.args = ["zhuhuifeng", "12345"]end把adduser.sh脚本上传到虚拟机中。马克思主义经典著作执行adduser.sh脚本并传入参数,其实这个操作是用root用户执行,执行的时候不可以写$HOME,因为这里的$HOME是/root。执行脚本的操作肯定是要在上传脚本之后,所以指定了after: "fileProvision"字段,保证执行的顺序。十、批量创建主机分别创建主机上面所有的操作都是基于单主机的,如果要一次创建多个主机,vagrant也是支持的。
config.vm.define "web", primary: true do |web| web.vmwork "private_network", ip: "192.168.8.101" web.vm.provider :virtualbox do |vb| vb.name = "dev_web" endendconfig.vm.define "db" do |db| db.vmwork "private_network", ip: "192.168.8.102" db.vm.provider :virtualbox do |vb| vb.name = "dev_db" endendconfig.vm.define "db_follower", autostart: false do |fl| fl.vmwork "private_network", ip: "192.168.8.103" fl.vm.provider :virtualbox do |vb| vb.name = "dev_db_follower" endend在多台虚拟机的情况下,执行像vagrant ssh这样的命令是必须要指定主机名字的,不然vagrant也不知道用户需要连接到哪个主机。primary: true会指定一个默认主机,这样你执行vagrant ssh就会进入到这个默认主机。只可以指定一个默认主机。autostart: false这个字段为false的话,意味着要使用vagrant up db_follower启动,不带名字,就不会启动。优先级问题多主机还有一个问题,看下面代码:
config.vm.provider :virtualbox do |vb| vb.cpus = 4endconfig.vm.define "web" do |web| web.vmwork "private_network", ip: "192.168.8.101" web.vm.provider :virtualbox do |vb| vb.name = "免费标准下载网dev_web" endendconfig.vm.define "db" do |db| db.vmwork "private_network", ip: "192.168.8.102" db.vm.provider :virtualbox do |vb| vb.name = "dev_db" vb.cpus = 2 endendconfig.vm.provider :virtualbox do |vb| vb.cpus = 3end问:web和db最终的cpu核心charles数是几个?代码执行的顺序是外层上面代码 > 外层下面代码 > 内层代码,最终变量的值等于最后一次赋值。所以web主机的核心数是3个,db主机的核心数是2个。
循环创建另外,如果要N个节点,每个节点的配置都相同,只有IP地址等不同的话,可以用ruby的循环来批量创建,如下面的事例:
(1 .. 5).each do |i| config.vm.define "server-node-#{i}", primary: (i == 1) do |node| ip_address = 100 + i node.vmwork "private_network", ip: "192.168.8.#{ip_address}" node.vm.provider :virtualbox do |vb| vb.name = "dev-server-node-#{i}" vb.memory = 1024 vb.cpus = 2 end endend默认情况下,vagrant up/reload/destroy/suspend/resume等命令,不指定名字的话都是针对所有主机。如果只想重启第3台到第5台的虚拟机,可以这样写vagrant reload /server-node-[3-5]/。其他命令也是同理。
十一、小结基础篇到这里就结束了,高级篇可以写写虚拟机共享、box创建、插件使用等等。码子好累,结束~~~
本文发布于:2023-06-04 07:54:19,感谢您对本站的认可!
本文链接:http://www.ranqi119.com/ge/85/214670.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |