Skip to content

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)

uml diagram

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.sh

ls5 安装 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

Jenkins 发布流程(更详细 PlantUML)

1)Blog/Vue(apps/blog)参数化流水线 + 多机原子发布

uml diagram

2)Pixiu/Java(apps/pixiu-mall-parent)构建 jar + 发布到目标机(可选 systemd 重启)

uml diagram

3)为什么要“临时目录 + 原子切换”(避免 404/半更新)

uml diagram