Vagrant搭建虚拟机集群

标签: Vagrant   Cluster  

本文将将介绍如何使用Vagrant+VirtualBox搭建多节点Centos7虚拟机集群

工具准备

本人的机器环境是:MacOS

1. 安装 VirtualBox

2. 安装 Vagrant

Vagrant 的常用操作命令

命令 作用
vagrant box add 添加box的操作
vagrant init 初始化box的操作,会生成vagrant的配置文件Vagrantfile
vagrant up 启动本地环境
vagrant ssh 通过ssh登录本地环境所在虚拟机
vagrant halt 关闭本地环境
vagrant suspend 暂停本地环境
vagrant resume 恢复本地环境
vagrant reload 修改了Vagrantfile后,使之生效(相当于先 halt,再 up)
vagrant destroy 彻底移除本地环境
vagrant box list 显示当前已经添加的box列表
vagrant box remove 删除相应的box
vagrant package 打包命令,可以把当前的运行的虚拟机环境进行打包
vagrant plugin 用于安装卸载插件
vagrant status 获取当前虚拟机的状态
vagrant global-status 显示当前用户Vagrant的所有环境状态

Vagrant 配置文件操作

config.vm

config.vm中设置了Vagrant管理的机器的配置。

配置 作用
config.vm.boot_timeout Vagrant等待机器启动并可访问的时间(秒 默认情况下,这是300秒。
config.vm.box 这将配置该机器要下载的box。可以去HashiCorp/Vagrant Cloud中查找已安装框的名称或框的简写名称。此选项需要Vagrant 1.5或更高版本。
config.vm.box_check_update 如果为true,Vagrant会在每次执行vagrant up时检查配置的config.vm.box的更新。 如果发现更新,Vagrant会告诉用户.
config.vm.box_download_checksum config.vm.box_url指定的box的校验。如果未指定,则不会执行校验和比较。如果指定,Vagrant会将下载的box校验与这个值和错误进行比较,如果指定了此选项,则还必须指定`config.vm.box_download_checksum_type。
config.vm.box_download_checksum_type 指定的校验和类型。支持的值目前是“md5”,“sha1”和“sha256”,如果执行则还必须指定config.vm.box_download_checksum
config.vm.box_download_client_cert 下载邮箱时使用的客户端证书的路径(如果有必要)。 默认情况下,不使用客户端证书来下载该框。
config.vm.box_download_ca_cert 直接下载盒子时使用的CA证书包的路径。 默认情况下,Vagrant将使用Mozilla CA证书包。
config.vm.box_download_ca_path 包含CA证书的目录的路径,用于直接下载box。 默认情况下,Vagrant将使用Mozilla CA证书包。
config.vm.box_download_insecure 如果为true,则来自服务器的SSL证书将不会被验证。 默认情况下,如果URL是HTTPS URL,则SSL证书将被验证。
config.vm.box_download_location_trusted 如果为true,则所有HTTP重定向将被视为可信。这意味着用于初始URL的凭证将用于所有后续重定向。默认情况下,重定向位置不受信任,因此凭据(如果指定)仅用于初始HTTP请求。
config.vm.box_url 可以找到配置的 box的URL。如果config.vm.box的是值是HashiCorp或者Vagrant Cloud中的一个box的简写,那么不需要指定该值。否则,它应该指向没有安装的盒子可以找到的适当位置。
config.vm.box_version 要使用box的版本
config.vm.communicator 用于连接到 guest box 的通信器类型。默认情况下是“ssh”,但对于 Windows 虚拟机应更改为“winrm”。
config.vm.graceful_halt_timeout 调用 vagrant halt 时 Vagrant 等待机器正常停止的时间。默认为 60 秒。
config.vm.guest 将在本机中运行的客户操作系统。默认为 linux,Vagrant 会自动检测正确的发行版。Vagrant 需要知道这些信息才能执行某些客户操作系统特定的事情,例如挂载目录和配置网络。
config.vm.hostname 机器应具有的主机名。默认为 nil。如果为 nil,Vagrant 将不管理主机名。如果设置为字符串,主机名将在引导时设置。
config.vm.network 参考下文网络配置
config.vm.post_up_message 执行 vagrant up 之后显示给用户的消息,可以用于指示如何访问开发环境的各个组件等。
config.vm.provider 配置 provider 特定的配置,该配置用于修改特定于某个 provider 的设置。如果您正在配置的 provider 不存在或未在运行 Vagrant 的系统上设置,则 Vagrant 将忽略此配置块。这允许共享一个适用于多个 provider 的 Vagrantfile,即使没有安装所有的 provider(至少要安装 Vagrantfile 要求的一个 provider)。
config.vm.provision 在机器上配置 provisioner,以便在创建机器时自动安装和配置软件。 参考:provisioner
config.vm.synced_folder 在机器上配置已同步的目录,以便主机上的目录可以与客户机同步。
config.vm.usable_port_range Vagrant 可以使用的用来处理端口冲突的一系列端口。默认为 2200..2250。

config.ssh

config.ssh涉及配置Vagrant如何通过SSH访问你的机器。大多数Vagrant的设置,默认值通常就够用了,但是我们还是可以根据自己的实际情况做出微调。

配置 作用
config.ssh.username 默认设置Vagrant将SSH作为用户名。如果自定义设置了用户名,则可以自由覆盖此内容。
config.ssh.password 设置Vagrant将用于验证SSH用户的密码。Vagrant建议在下面使用基于密钥的身份验证而不是密码。
config.ssh.host SSH进入的主机名或IP。默认情况下,这是空的,因为服务提供商通常会为您解决这个问题。
config.ssh.port 进入SSH的端口。默认情况下,这是端口22。
config.ssh.guest_port 运行SSH的guest虚拟机上的端口。这被一些提供商用来检测转发的SSH端口。例如,如果设置为22(默认值),并且Vagrant从主机上的端口4567检测到来宾端口22上的转发端口,则Vagrant将尝试使用端口4567与来宾进行对话(如果没有其他端口)选项。
config.ssh.private_key_path 用于SSH访问客机的私钥的路径。默认情况下,这是随Vagrant一起提供的不安全私钥,因为这是公共盒子使用的私钥。如果您使用自定义SSH密钥创建自己的自定义框,则应该指向该私钥。
config.ssh.keys_only 仅使用Vagrant提供的SSH私钥(不要使用存储在ssh-agent中的任何密钥)。默认值是true。
config.ssh.verify_host_key 执行严格的主机密钥验证。默认值是false。
config.ssh.forward_agent 如果为true,则启用通过SSH连接的代理转发。默认为false。
config.ssh.forward_x11 如果为true,则启用通过SSH连接进行的X11转发。默认为false。
config.ssh.forward_env 要转发给guest虚拟机的主机环境变量数组
config.ssh.insert_key 如果为true,Vagrant将自动插入一个用于SSH的密钥对,如果检测到,则替换机器内部的Vagrant默认不安全密钥。默认为 true
config.ssh.proxy_command 执行命令行命令,接收要在stdin上发送到SSH的数据。
config.ssh.pty 如果为true,pty将用于供应。默认为false。
config.ssh.keep_alive 如果为true,则此设置将默认每隔5秒发送一次保持活动数据包,以保持连接处于活动状态。
config.ssh.shell 执行来自Vagrant的SSH命令时使用的shell。默认情况下,这是bash -l。请注意,这对运行vagrant ssh时获得的shell没有影响。此配置选项仅影响在Vagrant内部执行命令时使用的shell。
config.ssh.export_command_template 用于在活动会话中生成导出的环境变量的模板。
config.ssh.sudo_command 使用sudo执行命令时使用的命令。
config.ssh.compression 如果设置为false,则此设置将不包括ssh进入机器时的压缩设置。 如果没有设置,它将默认为true,Compression = yes将使用ssh启用。
config.ssh.dsa_authentication 如果为false,则此设置在ssh登录到计算机时不包括DSAAuthentication。 如果未设置,则默认为true,DSAAuthentication = yes将与ssh一起使用。
config.ssh.extra_args 此设置值直接传递到ssh可执行文件中。 这使您可以传递任何命令来执行诸如反向隧道切入ssh程序之类的任务。

Vagrantfile

1. 初始化一个工作目录

比如:~/Document/vagrant

使用命令:vagrant init初始化,会自动生成Vagrantfile文件

2. 下载centos系统

vagrant box add centos/7

 Vagrant Box的中央仓库地址

3. 配置Vagrantfile文件,创建一个3个节点的虚拟机

Vagrant.configure("2") do |config|
   (1..3).each do |i|
        config.vm.define "node#{i}" do |node|
            # 设置虚拟机的Box
            node.vm.box = "centos/7"

            # 设置虚拟机的主机名
            node.vm.hostname="node#{i}"

            # 设置虚拟机的IP
            node.vm.network "private_network", ip: "192.168.56.#{100+i}"

            # 设置主机与虚拟机的共享目录
            # node.vm.synced_folder "~/Documents/vagrant/share", "/home/vagrant/share"

            # VirtaulBox相关配置
            node.vm.provider "virtualbox" do |v|
                # 设置虚拟机的名称
                v.name = "node#{i}"
                # 设置虚拟机的内存大小
                v.memory = 2048
                # 设置虚拟机的CPU个数
                v.cpus = 1
            end
        end
   end
end

语法还是比较易懂的,下面介绍其中几个比较关键的句法

deploy.vm.provider

这句指定了虚拟机的提供者是。本例中是 virtualbox。需要注意的是 Vagrant 只是虚拟机的编排工具,而它本身并不提供虚拟技术,需要跟其他虚拟机软件结合,例如:virtualbox、libvirt。接下来的 v 就是对这台虚拟机的设置。

  • v.name:virtualbox 中这台虚拟机的名字。
  • v.memory:该虚拟机的内存大小,单位是 MB。
  • v.cpus:该虚拟机的 CPU 核数。

vm.box

该虚拟机的初始化镜像名称,这里是 centos/7

vm.hostname

该虚拟机的 hostname,很重要,ssh 连接时用的就是这个名字。请起一个有意义的名字,不然以后又得重设啦。

vm.network

网络设置,Vagrant 有三种网络设置模式:

Forwarded port

这种方式把本机和虚拟机的端口进行映射,例如:

config.vm.forwarded_port 80, 8080

这是把虚拟机的 80 端口映射到宿主机的 8080 端口,这样访问宿主机的 8080 端口就相当于访问虚拟机的 80 端口了。

Private network

这种方式是私有网络,只允许宿主机访问虚拟机。如果多个虚拟机设定在同一个网段,那么几个虚拟机之间也可以互相访问。相当于搭建了个小型集群。

Public network

这种方式虚拟机的网络配置跟宿主机的网络配置一样,在外网别可以像访问宿主机一样访问虚拟机。

启动虚拟机

之前介绍的,就是本地搭建集群所需掌握的 Vagrantfile 文件格式的基本内容了。下面介绍如何从这个配置文件来启动这组虚拟机。

将上面的文件保存为 Vagranfile,然后在 Vagranfile 文件所在目录执行:

vagrant up

这时候整个集群启动完毕了。

使用虚拟机

前面说过要连接虚拟机,是要使用虚拟机的 hostname,比如:

vagrant ssh node1

这句命令会以 vagrant 的用户登录到 deploy 虚拟机节点,然后可以用 sudo su 命令获得 root 权限。

用一下指令可以查看虚拟机的 ssh 配置详细情况:

vagrant ssh-config

当我们想暂时关闭虚拟机时可以:

vagrant halt

这个命令会关掉整组虚拟机,要是我们只想关掉 deploy 可以用:

vagrant halt node1

当我们玩腻了,想要删掉虚拟机可以:

vagrant destroy

Vagrant 会每台机子询问是否删除。

免密登陆

(1)配置hosts

每台机器上都做如下配置:

vi /etc/hosts

增加如下内容:
192.168.56.101 node1
192.168.56.102 node2
192.168.56.103 node3

(2) 生成秘钥

ssh-keygen -t rsa

默认的路径在/home/vagrant/.ssh/

复制到其他虚拟机即可实现免密登陆:

ssh-copy-id vagrant@node1
ssh-copy-id vagrant@node2
ssh-copy-id vagrant@node3

如果免密登陆失败,是ssh密码校验没有开启,可以如下操作:

vi /etc/ssh/sshd_config
开启如下配置:
PasswordAuthentication yes
systemctl restart sshd

这样就全部完成啦!!!

「真诚赞赏,手留余香」

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章