目 录CONTENT

文章目录

晶哥哥常用的Vagrant配置

筱晶哥哥
2023-11-19 / 0 评论 / 1 点赞 / 152 阅读 / 19785 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

记录Vagrant创建虚拟机的Vagrantfile配置,根据实际使用情况会不断完善。

CentOS

Vagrant.configure("2") do |config|
    # box镜像地址
    config.vm.box_url = "https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box"

	# 设置虚拟机的Box,使用的虚拟机镜像
	config.vm.box = "centos/7"

	# 设置虚拟机的主机名
	config.vm.hostname="lijing-centos7"
    
    # 设置磁盘大小,视情况而定
    # 记得先安装插件: vagrant plugin install  --plugin-clean-sources vagrant-disksize-0.1.3.gem
    # 到此处下载:https://share.weiyun.com/egZ7oNo2
    # 如果想要扩容,则需要执行 vagrant halt 关闭vagrant,然后重新拉起:vagrant up
    config.disksize.size = '50GB'

	# 设置虚拟机的网络
    
    # 1、Vagrant总是将虚拟机的第一个网卡设置为NAT,即网络地址转换,虚拟机只可以单向访问外网,但是外网访问不了虚拟机,虚拟机之间也是相互隔离的。在NAT模式下,如果想访问虚拟机的端口,可以使用端口转发,端口转发虽然可以访问虚拟机的服务,但是不适合搭建分布式集群。
    
    # 2、使用私有网络,可以实现虚拟机之间的访问,Vagrant将网卡设置为仅主机模式(Host-only),顾名思义,只能从宿主机访问虚拟机,无法通过外部主机访问虚拟机。
	config.vm.network "private_network", ip: "192.168.56.104"
    
    # 3、如果要从别的主机访问虚拟机,可以设置公有网络,在virtualbox中使用bridge桥接网络实现,桥接网络将虚拟机等同于网络中的真实主机,可以像访问其他主机一样访问虚拟机。
    # 除了指定ip,还需要指定桥接的网卡,查看桥接网卡命令为:VBoxManage list bridgedifs,记得将virtualbox目录添加到环境变量,否则找不到命令
    config.vm.network "public_network", ip: "192.168.0.201", bridge: "Realtek Gaming 2.5GbE Family Controller"

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

    # 虚拟化提供者 provider
	# VirtaulBox相关配置,修改后,使用 vagrant reload 会自动修改对应配置
	config.vm.provider "virtualbox" do |v|
		# 设置虚拟机的名称,这个会在VirtualBox中显示的
		v.name = "lijing-centos7"
		# 设置虚拟机的内存大小
		v.memory = 4096
		# 设置虚拟机的CPU个数
		v.cpus = 4
	end
    
    # 配置管理器 provision
    # 配置管理器只在第一次使用 vagrant up 创建环境时执行,如果虚拟机已经创建,则vagrant up或vagrant reload不会再次运行配置管理器,需要显式调用
    # vagrant up --provision
    # vagrant reload --provision
    # 手动执行(常用来测试或调试脚本):vagrant provision
    
    # 配置Shell脚本在虚拟机创建后启动时自动执行
    # 修改vagrant用户密码
    config.vm.provision "shell", inline: "echo vagrant:lijing123456 | sudo chpasswd"
    # 修改root用户密码
    config.vm.provision "shell", inline: "echo root:lijing123456 | sudo chpasswd"
    # 启用ssh密码登录,使用外部脚本,注意脚本位置
    config.vm.provision "shell", path: "enablePasswordAuth.sh"
    # 安装软件操作
    config.vm.provision "shell", inline: <<-SHELL

      # 命令补全工具
      yum install -y bash-completion

      # 安装vim
      yum install -y vim

      # 安装docker和docker-compose
      # 卸载旧版本
      yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
      # 使用国内阿里云镜像,十分快
      yum-config-manager \
        --add-repo \
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      # 更新yum软件包索引
	  yum makecache fast
      yum install -y docker-ce-20.10.7-3.el7 docker-ce-cli-20.10.7-3.el7 containerd.io docker-compose-plugin
      # 启动docker
      systemctl start docker

 	  # 编写镜像加速配置文件
      sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n2zg5mlq.mirror.aliyuncs.com"]
}
EOF
      # 重启服务
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      # 设置开机自启
      systemctl enable docker.service

      # 查看版本
      docker version
      docker compose version

    SHELL
end

enablePasswordAuth.sh

# 将 sshd_config 文件中以 PasswordAuthentication 开头的行(以 ^ 表示开头)替换为 PasswordAuthentication yes。
# 换句话说,它将禁用 SSH 密码身份验证更改为启用密码身份验证。
# 第二个是将每一行以 “#” 开头的部分去除注释符号 “#”
echo "==> Enable ssh password authentication"
sed -i 's/^PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
# sed -i 's/^#\(LoginGraceTime\|PermitRootLogin\|StrictModes\|MaxAuthTries\|MaxSessions\)/\1/' /etc/ssh/sshd_config
systemctl reload sshd
service sshd restart
service ssh restart

Ubuntu

Vagrant.configure("2") do |config|
    # box镜像地址,可能会有变化,如果找不到去清华镜像源处看看
    config.vm.box_url = "https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/jammy/20231201/jammy-server-cloudimg-amd64-vagrant.box"
    # 可以使用离线文件
    # config.vm.box_url = "file://D:/project/images/jammy-server-cloudimg-amd64-vagrant.box"

	# 设置虚拟机的Box,使用的虚拟机镜像
	config.vm.box = "ubuntu/jammy64"

	# 设置虚拟机的主机名
	config.vm.hostname="lijing-ubuntu"
    
    # 设置磁盘大小,视情况而定
    # 记得先安装插件: vagrant plugin install  --plugin-clean-sources vagrant-disksize-0.1.3.gem
    # 到此处下载:https://share.weiyun.com/egZ7oNo2
    # 如果想要扩容,则需要执行 vagrant halt 关闭vagrant,然后重新拉起:vagrant up
    config.disksize.size = '50GB'

	# 设置虚拟机的网络
    
    # 1、Vagrant总是将虚拟机的第一个网卡设置为NAT,即网络地址转换,虚拟机只可以单向访问外网,但是外网访问不了虚拟机,虚拟机之间也是相互隔离的。在NAT模式下,如果想访问虚拟机的端口,可以使用端口转发,端口转发虽然可以访问虚拟机的服务,但是不适合搭建分布式集群。
    
    # 2、使用私有网络,可以实现虚拟机之间的访问,Vagrant将网卡设置为仅主机模式(Host-only),顾名思义,只能从宿主机访问虚拟机,无法通过外部主机访问虚拟机。
	config.vm.network "private_network", ip: "192.168.56.104"
    
    # 3、如果要从别的主机访问虚拟机,可以设置公有网络,在virtualbox中使用bridge桥接网络实现,桥接网络将虚拟机等同于网络中的真实主机,可以像访问其他主机一样访问虚拟机。
    # 除了指定ip,还需要指定桥接的网卡,查看桥接网卡命令为:VBoxManage list bridgedifs,记得将virtualbox目录添加到环境变量,否则找不到命令
    config.vm.network "public_network", ip: "192.168.0.201", bridge: "Realtek Gaming 2.5GbE Family Controller"

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

    # 虚拟化提供者 provider
	# VirtaulBox相关配置,修改后,使用 vagrant reload 会自动修改对应配置
	config.vm.provider "virtualbox" do |v|
		# 设置虚拟机的名称,这个会在VirtualBox中显示的
		v.name = "lijing-ubuntu"
		# 设置虚拟机的内存大小
		v.memory = 4096
		# 设置虚拟机的CPU个数
		v.cpus = 4
	end
    
    # 配置管理器 provision
    # 配置管理器只在第一次使用 vagrant up 创建环境时执行,如果虚拟机已经创建,则vagrant up或vagrant reload不会再次运行配置管理器,需要显式调用
    # vagrant up --provision
    # vagrant reload --provision
    # 手动执行(常用来测试或调试脚本):vagrant provision
    
    # 配置Shell脚本在虚拟机创建后启动时自动执行
    # 修改vagrant用户密码
    config.vm.provision "shell", inline: "echo vagrant:lijing123456 | sudo chpasswd"
    # 修改root用户密码
    config.vm.provision "shell", inline: "echo root:lijing123456 | sudo chpasswd"
    # 启用ssh密码登录,使用外部脚本,注意脚本位置
    config.vm.provision "shell", path: "enablePasswordAuth.sh"
    # 安装软件操作
    config.vm.provision "shell", inline: <<-SHELL

      # 命令补全工具
      sudo apt-get install -y bash-completion

      # 安装vim
      sudo apt-get install -y vim

      # 安装docker和docker-compose
      # ubuntu可能会自带docker并且版本太低,需要先卸载旧的再安装新的
      sudo apt-get remove docker docker-engine docker.io containerd runc -y
      # 获取软件最新源
      sudo apt-get -y update
      # 安装 apt 依赖包
      sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
      # 安装GPG证书
      curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
      # 设置稳定版仓库
      sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
      
      # 再次更新软件源
      sudo apt-get -y update
      
      # 安装最新版本
      # sudo apt-get install docker-ce docker-ce-cli containerd.io -y
      # 安装指定版本
      sudo apt-get install -y docker-ce=5:20.10.17~3-0~ubuntu-jammy docker-ce-cli=5:20.10.17~3-0~ubuntu-jammy containerd.io docker-compose-plugin
   
      # 启动docker
      systemctl start docker

 	  # 编写镜像加速配置文件
      sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n2zg5mlq.mirror.aliyuncs.com"]
}
EOF
      # 重启服务
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      # 设置开机自启
      systemctl enable docker.service

      # 查看版本
      docker version
      docker compose version

    SHELL
end

enablePasswordAuth.sh

# 将 sshd_config 文件中以 PasswordAuthentication 开头的行(以 ^ 表示开头)替换为 PasswordAuthentication yes。
# 换句话说,它将禁用 SSH 密码身份验证更改为启用密码身份验证。
echo "==> Enable ssh password authentication"
sed -i 's/^PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo su -c "echo 'LoginGraceTime 2m' >> /etc/ssh/sshd_config"
sudo su -c "echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config"
sudo su -c "echo 'StrictModes yes' >> /etc/ssh/sshd_config"
sudo su -c "echo 'MaxAuthTries 6' >> /etc/ssh/sshd_config"
sudo su -c "echo 'MaxSessions 10' >> /etc/ssh/sshd_config"
systemctl reload sshd
service sshd restart
service ssh restart

卸载(如有需要可执行)

删除安装包

sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc

删除相关配置文件

dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 

卸载相关插件

sudo apt-get autoremove docker-ce-*

删除docker的相关配置

sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker

查询下docker相关软件包

dpkg -l | grep docker

验证

docker version

虚拟机扩容

我使用CentOS扩容的时候,需要手动增加分区容量,但是Ubuntu我改了容量后,自动帮我扩容了分区。

如果硬盘扩容了,但是分区信息没有变,则按照以下步骤执行。

如果虚拟机扩容了,需要执行以下操作:

# 比如我50G,扩展成了100G
# 执行 vagrant halt 关闭vagrant,然后重新拉起:vagrant up,会自动新增磁盘空间,但是里面的分区大小还是40G
# 需要手动分配
config.disksize.size = '100GB'

先搞懂以下概念:Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。

因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。

如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。

挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。

纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。

举个例子,我们想通过命令行访问某个 U 盘中的数据, U 盘文件目录结构和 Linux 系统中的文件目录结构。

目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。

接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录

可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘。

前面讲过,根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。

总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。

新装的虚拟机,按照如下操作,切记是用vagrant创建的空虚拟机

如果你是刚装得虚拟机,建议如下操作,发现分区q

[root@lijing-centos7 ~]# df 
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs         1932460       0   1932460   0% /dev
tmpfs            1939976       0   1939976   0% /dev/shm
tmpfs            1939976    8676   1931300   1% /run
tmpfs            1939976       0   1939976   0% /sys/fs/cgroup
/dev/sda1       41921540 3389360  38532180   9% /
tmpfs             387996       0    387996   0% /run/user/1000
# 查看分区信息
fdisk -l

执行 fdisk /dev/sda 将之前的分区删掉,重新创建一个主分区

分区完,执行以下命令

partprobe /dev/sda
e2fsck /dev/sda1
xfs_growfs /dev/sda1

df -h 查看磁盘容量,扩容成功

如果已经有生产项目部署了,不要像上面那样操作,应该扩容分区

参考文章:点我跳转

运行以下命令,扩容指定分区。例如扩容分区名称为/dev/sda1的分区,则执行如下命令。

说明

  • 命令参数中的/dev/sda1之间需要空格分隔,1是分区编号。

步骤1:扩容分区

MBR分区

type growpart || yum install -y cloud-utils-growpart
LC_ALL=en_US.UTF-8 growpart /dev/sda 1

GPT分区(需安装gdisk工具)

# 分区名称视情况调整
type growpart || yum install -y cloud-utils-growpart
type sgdisk || yum install -y gdisk
LC_ALL=en_US.UTF-8 growpart /dev/sda 1 

如下所示,输出CHANGED字样时,表示分区扩容成功。

[root@lijing-centos7 dev]# LC_ALL=en_US.UTF-8 growpart /dev/sda 1
CHANGED: partition=1 start=2048 old: size=83884032 end=83886080 new: size=209713119 end=209715167

步骤2:扩容文件系统

运行以下命令,获取需要扩容的文件系统的类型和挂载目录。

df -Th

Type值为文件系统类型,Mounted on值为分区的挂载目录。如下表示/dev/sda1分区的文件系统类型为xfs,挂载目录为**/**。

[root@lijing-centos7 ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  1.9G     0  1.9G   0% /dev
tmpfs          tmpfs     1.9G     0  1.9G   0% /dev/shm
tmpfs          tmpfs     1.9G  8.5M  1.9G   1% /run
tmpfs          tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1      xfs       100G  3.3G   97G   4% /
tmpfs          tmpfs     379M     0  379M   0% /run/user/1000

如果Filesystem取值后缀不带数字(例如/dev/vdc),则为裸设备。

扩容文件系统:

扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。

ext*(例如ext2、ext3、ext4)文件系统:

resize2fs /dev/sda1

xfs文件系统

# / 为挂载点
type xfs_growfs || yum install -y xfsprogs
xfs_growfs /

btrfs文件系统

btrfs filesystem resize max /

运行以下命令,确认是否扩容成功。

df -Th

当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。

1

评论区