System Manager远程部署教程:通过SSH管理多台服务器
System Manager是一款强大的系统配置管理工具,能够通过SSH在任何Linux发行版上使用Nix管理系统配置。本教程将详细介绍如何通过SSH远程部署和管理多台服务器,帮助你轻松实现服务器配置的统一管理和自动化部署。
远程部署前的准备工作 📋
在开始远程部署前,需要确保满足以下条件:
- SSH访问权限:确保你能够通过SSH连接到目标服务器
- Nix已安装:目标服务器上需要安装Nix包管理器
- SSH密钥配置:建议配置SSH密钥实现无密码认证,提高安全性和部署效率
配置远程服务器的Nix信任设置
远程服务器的Nix守护进程需要信任来自本地机器的存储路径,否则会拒绝复制文件。编辑远程服务器上的/etc/nix/nix.conf文件,添加以下内容(将"ubuntu"替换为实际使用的用户名):
trusted-users = root ubuntu
build-users-group = nixbld
然后重启Nix守护进程:
sudo systemctl restart nix-daemon
基本远程部署步骤 🔧
部署本地配置到单台服务器
使用以下命令将本地配置部署到远程服务器:
nix run 'github:numtide/system-manager' -- --target-host user@remote-host \
switch \
--flake . \
--sudo
从远程Flake部署配置
如果你的配置托管在GitHub上,可以直接从远程Flake部署:
nix run 'github:numtide/system-manager' -- --target-host user@remote-host \
switch \
--flake github:your-username/your-config \
--sudo
为不同主机部署不同配置
如果不同主机需要不同配置,可以使用flake输出名称指定:
# 部署"webserver"配置到web.example.com
nix run 'github:numtide/system-manager' -- --target-host admin@web.example.com \
switch \
--flake .#webserver \
--sudo
# 部署"database"配置到db.example.com
nix run 'github:numtide/system-manager' -- --target-host admin@db.example.com \
switch \
--flake .#database \
--sudo
多服务器管理技巧 🚀
SSH配置优化
方法1:使用SSH配置文件
编辑~/.ssh/config文件,添加服务器信息:
Host webserver
HostName web.example.com
User admin
IdentityFile ~/.ssh/deploy_key
Host dbserver
HostName db.example.com
User admin
IdentityFile ~/.ssh/deploy_key
之后可以使用简化命令部署:
nix run 'github:numtide/system-manager' -- --target-host webserver \
switch \
--flake . \
--sudo
方法2:使用SSH Agent
如果不想修改SSH配置,可以在部署前加载密钥到SSH Agent:
eval $(ssh-agent -s)
ssh-add /home/ubuntu/.ssh/my.pem
nix run github:numtide/system-manager -- --target-host 'ubuntu@172.31.40.14' switch --flake . --sudo
批量部署到多台服务器
创建部署脚本deploy.sh:
#!/bin/bash
set -e
# 启动SSH agent并添加密钥
eval $(ssh-agent -s)
ssh-add ~/.ssh/my.pem
# 目标主机列表
HOSTS=(
"ubuntu@172.31.40.14"
"ubuntu@172.31.28.157"
"ubuntu@172.31.25.67"
)
# 部署到每台主机
for host in "${HOSTS[@]}"; do
echo "部署到 $host..."
nix run github:numtide/system-manager -- --target-host "$host" switch --flake . --sudo
done
# 清理SSH agent
ssh-agent -k
echo "部署完成!"
给脚本添加执行权限并运行:
chmod +x deploy.sh
./deploy.sh
从文件读取主机列表
对于更大规模的部署,可以从文件读取主机列表。创建hosts.txt:
# 生产服务器
ubuntu@172.31.40.14
ubuntu@172.31.40.15
# 测试服务器
ubuntu@172.31.40.20
然后创建部署脚本:
#!/bin/bash
set -e
eval $(ssh-agent -s)
ssh-add ~/.ssh/my.pem
while IFS= read -r host; do
[[ -z "$host" || "$host" =~ ^# ]] && continue # 跳过空行和注释
echo "部署到 $host..."
nix run github:numtide/system-manager -- --target-host "$host" switch --flake . --sudo
done < hosts.txt
ssh-agent -k
处理SSH主机密钥验证
首次连接远程服务器时,会遇到主机密钥验证提示,这会中断自动化脚本。以下是两种解决方案:
方法1:预扫描主机密钥
在部署前扫描并添加所有主机密钥到known_hosts:
#!/bin/bash
set -e
eval $(ssh-agent -s)
ssh-add ~/.ssh/my.pem
# 目标主机
HOSTS=(
"ubuntu@172.31.40.14"
"ubuntu@172.31.28.157"
"ubuntu@172.31.25.67"
)
# 预扫描并信任所有主机密钥
echo "扫描主机密钥..."
for host in "${HOSTS[@]}"; do
ip="${host#*@}" # 从ubuntu@172.31.x.x提取IP
ssh-keyscan -H "$ip" >> ~/.ssh/known_hosts 2>/dev/null
done
echo "主机密钥已添加到known_hosts"
# 部署到每台主机
for host in "${HOSTS[@]}"; do
echo "部署到 $host..."
nix run github:numtide/system-manager -- --target-host "$host" switch --flake . --sudo
done
ssh-agent -k
echo "部署完成!"
方法2:使用通配符SSH配置
如果服务器位于可预测的子网中(如AWS VPC),可以在~/.ssh/config中使用通配符:
Host 172.31.*
User ubuntu
IdentityFile ~/.ssh/my.pem
StrictHostKeyChecking accept-new
这样配置后,部署脚本可以简化为:
#!/bin/bash
set -e
# 目标主机 - 只需IP,凭据来自SSH配置
HOSTS=(
"172.31.40.14"
"172.31.28.157"
"172.31.25.67"
)
# 部署到每台主机
for host in "${HOSTS[@]}"; do
echo "部署到 $host..."
nix run github:numtide/system-manager -- --target-host "$host" switch --flake . --sudo
done
echo "部署完成!"
高级:从远程Flake部署
你可以直接从远程Git仓库部署配置,这对于CI/CD工作流特别有用:
#!/bin/bash
set -e
eval $(ssh-agent -s)
ssh-add ~/.ssh/my.pem
# 目标主机
HOSTS=(
"ubuntu@172.31.40.14"
"ubuntu@172.31.28.157"
"ubuntu@172.31.25.67"
)
# 预扫描并信任所有主机密钥
echo "扫描主机密钥..."
for host in "${HOSTS[@]}"; do
ip="${host#*@}" # 从ubuntu@172.31.x.x提取IP
ssh-keyscan -H "$ip" >> ~/.ssh/known_hosts 2>/dev/null
done
echo "主机密钥已添加到known_hosts"
# 从远程flake部署到每台主机
for host in "${HOSTS[@]}"; do
echo "部署到 $host..."
nix run github:numtide/system-manager -- --target-host "$host" switch --flake git+https://gitcode.com/gh_mirrors/sy/system-manager#default --sudo
done
ssh-agent -k
echo "部署完成!"
注意:使用远程flake时,确保仓库的
flake.lock文件引用了兼容版本的System Manager。可以通过在仓库中运行nix flake update来更新锁定文件到最新版本。
相关资源
- 使用远程Flakes - 在GitHub上托管你的配置
- CLI参考 - 完整的命令文档
- 项目源码:crates/system-manager/
- 部署工具脚本:tools/release.sh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



