System Manager远程部署教程:通过SSH管理多台服务器

System Manager远程部署教程:通过SSH管理多台服务器

【免费下载链接】system-manager Manage system config using nix on any distro 【免费下载链接】system-manager 项目地址: https://gitcode.com/gh_mirrors/sy/system-manager

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来更新锁定文件到最新版本。

相关资源

【免费下载链接】system-manager Manage system config using nix on any distro 【免费下载链接】system-manager 项目地址: https://gitcode.com/gh_mirrors/sy/system-manager

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值