什么是vargrant?
vagrant是一个构件虚拟开发环境的工具。他用于创建部署虚拟的开发环境;
白话:使用vagrant来创建和管理虚拟机的,而装虚拟机的文件由运维组对开发环境做的一个box的镜像。
这样做的目的,省去了我们搭建开发环境,直接装一个虚拟机,把正在使用的开发环境的镜像还原进去。
当然使用vagrant最主要解决的一个问题就是,让开发环境同步。“代码在我机子上运行没有问题”这种说辞将成为历史。
看下图,其中,第一种是直接在物理机上装 Hypervisor,然后再该层上安装我们自己的虚拟机,第二种是先在物理机上装任意一个操作系统,然后在此基础上安装 Hypervisor,再然后再该层上安装我们自己的虚拟机,我们大部分用 Vmware 都是第二种,Vagrant就是第一种,微软自带的hyper-v ;
vagrant 的构成
Vagrant 和 Docker 有什么区别?
Vagrant 对应的是VM层面的,而Docker对应的是Container
vagrant安装
1、安装 providers,你有两种选择,vritualbox 和 hyper-v,如果你是window10及以上系统,那么建议使用hyper-v,否则请您使用 vartualbox
如果是用微软自带的hyper-v,则你需要看:https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/about/;
如果你是用virtualBox,则你需要安装它,https://www.virtualbox.org/wiki/Downloads;vmware因为收费不推荐;
2、安装vagrant,https://www.vagrantup.com/downloads.html
检查是否成功安装:vagrant --version
通过vagrant安装box镜像
离线方式(强烈推荐)
1、下载box文件
vagrant部署环境时,需要一个box文件。如果是在公司里面,可以从他们那里拷一个box文件安装。这样安装的环境与他们是一致的。即模拟了一个开发环境。box文件也可以在网上下载。如:
在 http://www.vagrantbox.es/ 或 https://app.vagrantup.com/boxes/search 上找到适合你自己的box,然后将box文件下载下来;
2、把box文件添加到虚拟机
新建一个目录,将下载好的box镜像文件丢入里面,在里面用poershell运行(需要管理员身份运行):
//添加box镜像文件到虚拟机中
vagrant box add centosMix CentOS-7.1.1503-x86_64-netboot.box --provider=[hyperv|vertualbox]
或者你也可以不用下载下来,而是通过:
vagrant box add centosMix https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box
3、初始化虚拟机box文件
# centosMix 是上面命令中我们自定义的虚拟机名称
vagrant init centosMix
执行完上面的命令之后,可以在目录下看到一个已经生成的vagrantFile文件。这是一个配置文件,里面包含该虚拟机的一些配置信息,其实就几行而已,你可以去掉注释后看到。
4、启动虚拟机
vagrant up --provider=hyperv --color # 注意,安装到hyper上而不是virtualbox中
如果是 用virtualbox虚拟机的话,就写成:
vagrant up --provider=virtualbox --color
注意输出的信息,一般的,virtualbox的ip为127.0.0.1 端口为2222,而hyperv的ip为其显示的ip,端口是22;
判断是否成功安装:vagrant status
进行完上面步骤后,就可以像使用服务器一样,远程到虚拟机了。可以使用的工具有xshell工具,winscp等工具。
初始安装的时候后,远程的时候,使用的IP是127.0.0.1 端口号是2222(看输出信息知道的)。这些信息可以后续在进行设置。如果嫌麻烦,也可以修改vagrantFile文件之后,在进行安装。默认中的账号密码都为:vagrant
在线方式(国内用户不推荐)
略
常用命令
vagrant up
启动或创建(第一次)虚拟机
vagrant stauts
检查虚拟机状态
vagrant ssh
通过ssh连接
vagrant ssh-config
查看ssh配置信息
vagrant suspend/resume/reload/hat
暂停suspend / 重启resume、重载reload、停止halt(停止的虚拟机需要 up 启动)
vagrant destroy
删除/移除 虚拟机
vagrant destroy -f 强制删除所有虚拟机
已经删除的虚拟机,其所在的目录中的 .vagrant 也最好删除掉;
.vagrant 的目录结构
> tree /F
D:.
│ Vagrantfile
│
└─.vagrant
├─machines 虚拟机目录
│ └─default 我们创建的虚拟机名称,默认为default
│ └─hyperv 我们default虚拟机provider,为 hyperv,即:default虚拟机是通过 hyperv 创建的
│ │ action_configure
│ │ action_provision
│ │ action_set_name
│ │ box_meta
│ │ creator_uid
│ │ id
│ │ index_uuid
│ │ private_key ssh的登陆密钥key
│ │ synced_folders
│ │ vagrant_cwd
│ │
│ └─Virtual Hard Disks 虚拟机的磁盘文件
│ generic-ubuntu2004-hyperv.vhdx
│
└─rgloader
loader.rb
Box 文件目录在哪儿?
一般在 用户目录下的 .vagrant.d 目录中:
C:\Users\用户名\.vagrant.d\
C:\Users\用户名\.vagrant.d>tree /F
C:.
│ insecure_private_key
│ setup_version
│
├─boxes // box就存放在这里
│ ├─hyperv
│ │ └─0
│ │ └─hyperv
│ │ │ info.json
│ │ │ metadata.json
│ │ │ Vagrantfile
│ │ │
│ │ ├─Virtual Hard Disks
│ │ │ generic-ubuntu2004-hyperv.vhdx
│ │ │
│ │ └─Virtual Machines
│ │ box.xml
│ │ D90B1531-23A2-4D41-957F-8593E9356E69.vmcx
│ │ D90B1531-23A2-4D41-957F-8593E9356E69.vmgs
│ │ D90B1531-23A2-4D41-957F-8593E9356E69.VMRS
│ │
│ └─ubuntu
│ └─0
│ └─hyperv
│ │ info.json
│ │ metadata.json
│ │ Vagrantfile
│ │
│ ├─Virtual Hard Disks
│ │ generic-ubuntu2004-hyperv.vhdx
│ │
│ └─Virtual Machines
│ box.xml
│ D90B1531-23A2-4D41-957F-8593E9356E69.vmcx
│ D90B1531-23A2-4D41-957F-8593E9356E69.vmgs
│ D90B1531-23A2-4D41-957F-8593E9356E69.VMRS
│
├─data
│ │ checkpoint_cache
│ │ checkpoint_signature
│ │ lock.dotlock.lock
│ │
│ └─machine-index
│ index
│ index.lock
│
├─gems
│ └─2.7.4
├─rgloader
│ loader.rb
│
└─tmp
boxe1394d60c23f1a8b64cfb37d8591b8a521b31cdf
vagrantfile文件的写法
box的名称为 centos/7
安装后设置其hostname为vagrant-demo
安装的box版本为1905.1(注意:如果本地不存在该版本,会从网上拉取下来)
每次配置 vagrantfile 好后,需要重新创建vagrant;
更多配置前往:https://www.vagrantup.com/docs/vagrantfile 查看
vagrant的ssh连接
我们可以在 vagrantfile 目录下使用命令 vagrant ssh 来登陆我们的虚拟机而不需要输入用户名和密码,这是为什么?
执行vagrant ssh 命令后,vagrant会找 当前目录的.vagrant目录中的private.key文件,来登陆对应的虚拟机;注意:public.key 在创建linux时被注入到linux中了;
你也可以通过 vagrant ssh-config 来查看当前所在的虚拟机的信息;
有些时候,我们需要通过用户名密码来登陆虚拟机中,而vagrant在安装虚拟机时应将使用密码来登陆的功能禁用了,vagrant的本意就是建议我们最好通过private_key来登陆虚拟机,但是我们就像用密码,如何设置?
1、先用 vagrant ssh 登陆我们的虚拟机中(也就是先用 private_key 登陆我们的虚拟机)
2、在虚拟机中的 /etc/ssh/sshd_config 中,将 PermitRootLogin由no改为yes,保存
3、重启sshd服务:sudo service sshd restart
4、完毕,你可以退出,然后使用账号密码(都为vagrant)登陆到虚拟机了;
但是,我们还是建议你在生产环境中使用private_key来登陆到虚拟机中;
使用ssh的技巧(推荐设置)
我们输入 vagrant ssh-config 命令,输出的内容是可以被我们的ssh所使用的,也就是说,在任何目录中都能够快速的登陆到我们虚拟机中,而不需要先进入到 vagrantfile 目录中;
在 C:\Users\用户名\.ssh\ 目录中,新建一个 config 文件(如果不存在,注意没有文件名后缀),将上面红色框起来的内容复制到 config 文件中,修改 第一行 Host default,default 可以改为你熟悉的名字,比如这里是 hlinux;
这样,你就可以在任何目录中使用 ssh hlinux 来直接登录到虚拟机中了;
注意:hyper-v 新建的虚拟机的ip地址是不固定的,可能会在你重启电脑的时候变动,这时候使用 ssh hlinux 就无法登陆到虚拟机了,记得改ip即可;
insecure_private_key
所有创建出来的虚拟机,都可以使用 insecure_private_key 来连接到虚拟机中(vagrant在安装虚拟机的时候创建一个public_key安装在虚拟机中,对应的private_key就是:insecure_private_key 了);
insecure_private_key文件 存在哪里?
C:\Users\用户名\.vagrant.d\ 下
但是,我们并现在并不能通过 insecure_private_key 来连接到虚拟机,因为在你安装虚拟机时,vagrant会自己生成一个 一对private_key 和 public_key,public_key 注入到虚拟机,private_key 替换 insecure_private_key 了,如下图:
每台虚拟机目录中都有自己的 private_key文件:
而我想要的是以后所有创建出来的虚拟机都是用统一的 insecure_private_key 来登录,如何做?要想禁止 vagrant 去生成每个虚拟机自己的 key,就想是用 insecure_private_key,可以在每个 vagrantfile 中添加一句话:
这样,每次通过这个 vagrantfile 来生成虚拟机时,都不会生成自己独有的 key,而是使用统一使用 insecure_private_key 文件来登录到虚拟机中;
上图中已经没有 生成替换使用自己的key的信息了;
insecure_private_key 对应的 public_key 在虚拟中哪里呢?/home/vagrant/.ssh/authorized_keys,如下图:
一个vagrantfile创建多台虚拟机并对每个虚拟机单独设置
上图中配置了需要创建了两台虚拟机,第一台名为 web,且设置hostname和box_version,第二台名为 db,只设置了hostname,box_version将会使用全局的 1905.1 这个版本;
使用循环来设置多台虚拟机(更加灵活)
hyper-v 同步文件夹
宿主机的Vagrantfile所在的当前目录同步到虚拟机中的 /vagrant 目录中,同步的类型为smb
下面代码,是适配了 用 virtualbox 和 hyperv 两种provider的文件同步:
vagrant box 的操作(重要)
vagrant box 的存放是在:C:\Users\用户名\.vagrant.d\ 下的;
命令:
vagrant box list 列出所有已经安装的box
vagrant box add centos/7 下载 centos/7 这个box
vagrant box remove centos/7 [--provider=hyperv] 删除centos/7这个box