multipass
官网
安装
bash
# 安装 multipass # 在 Linux/Ubuntu 上安装 Multipass 管理虚拟机
sudo apt install multipass # 使用 apt 安装 Multipass 包
# 安装完成后将获得 multipass CLI
# 查看您的实例 # 列出现有的 Multipass 实例
multipass list # 显示实例名称、状态、IPv4 等信息脚本
win系统要使用cross-env设置环境变量
bash
pnpm add -wD cross-env// package.json
json
{
"scripts": {
"blog:deploy:multipass:win": "pnpm build:all && cross-env DEPLOY_ENV=multipass pnpm --filter blog docs:deploy",
"blog:deploy:multipass": "pnpm build:all && DEPLOY_ENV=multipass pnpm --filter blog docs:deploy"
}
}配置 ssh config
- 编辑 ~/.ssh/config
bash
Host ls4 # 为 multipass 实例 ls4 定义别名
HostName 192.168.64.4 # 指定该实例的 IPv4 地址
User laosu # 默认 SSH 登录用户
Host ls5 # 为 multipass 实例 ls5 定义别名
HostName 192.168.64.5 # 指定该实例的 IPv4 地址
User laosu # 默认 SSH 登录用户
Host ls3 # 为负载均衡实例 ls3 定义别名
HostName 192.168.64.3 # 指定该实例的 IPv4 地址
User laosu # 默认 SSH 登录用户批量创建用户laosu
bash
for host in humane-cattle laosu-xin-unbuntu proficient-trogon; do # 遍历三台实例的主机名
echo "正在配置 $host ..." # 输出当前处理的实例名
# 1. 启动 # 步骤1:确保实例处于运行状态
multipass start $host 2>/dev/null || true # 启动实例;如已启动则忽略错误
# 2. 传公钥到临时目录 # 步骤2:把本机 SSH 公钥传到实例的 /tmp
multipass transfer ~/.ssh/id_ed25519.pub $host:/tmp/id.pub # 传输 id_ed25519.pub 到远端 /tmp/id.pub
# 3. 创建用户、配置sudo、导入公钥 # 步骤3:在实例内创建用户、授权 sudo、导入公钥
multipass exec $host -- sudo bash -c ' # 以 sudo 在实例中执行一段 bash 脚本
# 如果用户不存在则创建 # 检查用户是否存在,不存在则创建
id -u laosu &>/dev/null || useradd -m -s /bin/bash laosu # 创建 laosu 用户,设置家目录与默认 shell
# 加sudo权限且免密 # 将该用户加入 sudo 组并配置免密
usermod -aG sudo laosu # 将 laosu 添加进 sudo 组
echo "laosu ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/laosu # 写入 sudoers 规则,允许免密执行所有命令
# 配置SSH # 创建并准备 SSH 目录与授权文件
mkdir -p /home/laosu/.ssh # 创建 ~/.ssh 目录(若不存在)
cat /tmp/id.pub >> /home/laosu/.ssh/authorized_keys # 将传入的公钥追加到 authorized_keys
chown -R laosu:laosu /home/laosu/.ssh # 调整目录与文件的属主属组
chmod 700 /home/laosu/.ssh # 设置 ~/.ssh 目录权限为 700
chmod 600 /home/laosu/.ssh/authorized_keys # 设置 authorized_keys 文件权限为 600
' # 结束远端脚本
echo "$host 配置完成!" # 提示该实例已配置完成
done # 循环结束win PowerShel 批量创建用户 laosu
bash
$instances = 'laosu-xin','cherry-elephant','limber-macaque','romantic-redhead','stylish-filefish'
foreach ($vm in $instances) {
Write-Host "正在配置 $vm ..."
multipass start $vm 2>$null
# 关键是这里:用 ${vm} 或 $() 包一下变量
multipass transfer "$env:USERPROFILE\.ssh\id_ed25519.pub" "${vm}:/tmp/id.pub"
multipass exec $vm -- sudo bash -c "
id -u laosu &>/dev/null || useradd -m -s /bin/bash laosu
usermod -aG sudo laosu
echo 'laosu ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/laosu
mkdir -p /home/laosu/.ssh
cat /tmp/id.pub >> /home/laosu/.ssh/authorized_keys
chown -R laosu:laosu /home/laosu/.ssh
chmod 700 /home/laosu/.ssh
chmod 600 /home/laosu/.ssh/authorized_keys
"
Write-Host "$vm 配置完成!"
}部署流程详解(PlantUML)
ls4, ls5 安装 nginx
bash
# 配置 ls4
ssh ls4 'bash -s' < ./apps/blog/devops/multipass/setup-backend-nginx.sh
# 配置 ls5
ssh ls5 'bash -s' < ./apps/blog/devops/multipass/setup-backend-nginx.shls5 安装 Jenkins
bash
# 1. 先把最新的脚本传过去
scp ./apps/blog/devops/multipass/setup-ls5-jenkins.sh ls5:/tmp/setup-jenkins.sh
# 2. 执行强力安装命令
ssh ls5 "sudo killall apt apt-get 2>/dev/null; sudo rm -f /var/lib/dpkg/lock-frontend; sudo bash /tmp/setup-jenkins.sh"为什么这样处理:
- killall apt apt-get : 强行停止后台自动更新进程。
- rm -f /var/lib/dpkg/lock-frontend : 手动删掉锁定文件,让 apt 恢复工作。
- setup-ls5-jenkins.sh : 现在的脚本已经去掉了不必要的 Node.js 安装,只专注安装 Jenkins 和 Java 依赖。
ls5 扩容
bash
# 1. 先停止 ls5j
multipass stop ls5
# 2. 扩容到 20GB
multipass set local.ls5.disk=20G
# 3. 启动 ls5
multipass start ls5
# 4. 检查 ls5 磁盘空间
multipass exec ls5 -- df -h