脚本能自动配置SSH密钥吗?

wen 实用脚本 2

脚本能自动配置SSH密钥吗?自动化运维的终极指南

目录导读

  1. SSH密钥配置的核心痛点
  2. 脚本自动配置SSH密钥的可行性分析
  3. 主流自动配置方案详解
  4. 常见问答与避坑指南
  5. 企业级自动化配置最佳实践

SSH密钥配置的核心痛点

在运维管理中,手动配置SSH密钥既耗时又容易出错,传统流程需要:生成密钥对→将公钥复制到目标服务器→设置文件权限→测试连接,当管理成百上千台服务器时,这个重复劳动会严重拖累效率。

脚本能自动配置SSH密钥吗?

典型问题场景

  • 新服务器上线时需要逐台手动操作
  • 密钥轮换导致全量服务器需要更新
  • 不同团队之间密钥管理混乱

脚本能自动配置SSH密钥吗?

答案是肯定的,通过Shell、Python或Ansible等工具编写的脚本,完全可以实现SSH密钥的自动生成、分发和配置,这类脚本通常包含以下能力:

  • 自动检测:检查目标主机是否已存在密钥
  • 批量分发:通过SSH协议或SSH-copy-id工具将公钥写入~/.ssh/authorized_keys
  • 权限修复:自动设置~/.ssh目录权限为700,authorized_keys文件权限为600
  • 连接验证:自动测试新密钥是否可以成功登录

不过需要注意,首次配置时可能需要交互式密码输入,这可以通过expect工具或SSH密钥交换协议(如SSH代理转发)解决。

主流自动配置方案详解

纯Shell脚本

#!/bin/bash
# 自动配置SSH密钥脚本
SSH_DIR="$HOME/.ssh"
KEY_NAME="id_rsa"
# 生成密钥(非交互模式)
ssh-keygen -t rsa -b 4096 -f "$SSH_DIR/$KEY_NAME" -N "" -q
# 循环分发到目标主机列表
for host in $(cat servers.txt); do
    ssh-copy-id -i "$SSH_DIR/$KEY_NAME.pub" user@$host
    echo "密钥已部署到: $host"
done

优点:零依赖,兼容性好
缺点:需要输入密码,无法处理异常

Ansible自动化

Ansible是更专业的配置管理工具,通过authorized_key模块可无密码分发:

- name: 配置SSH免密登录
  hosts: all
  tasks:
    - name: 生成SSH密钥对
      openssh_keypair:
        path: /root/.ssh/id_rsa
        type: rsa
        size: 4096
        state: present
    - name: 分发公钥到目标主机
      authorized_key:
        user: root
        state: present
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"

优点:幂等性(重复执行不会出错)、支持并行分发、错误回滚
缺点:需要预先在控制节点配置SSH密码或密钥

Python脚本更灵活

import os
import paramiko
def deploy_ssh_key(host, password, username="root"):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 使用密码连接(首次部署必需)
    client.connect(host, username=username, password=password)
    # 生成密钥(若不存在)
    stdin, stdout, stderr = client.exec_command('''
        if [ ! -f ~/.ssh/id_rsa ]; then
            ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
        fi
        cat ~/.ssh/id_rsa.pub
    ''')
    public_key = stdout.read().decode()
    # 添加公钥到authorized_keys
    client.exec_command(f'echo "{public_key}" >> ~/.ssh/authorized_keys')
    client.exec_command('chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys')
    client.close()

优点:可定制性强,支持复杂逻辑(如错误重试、日志记录)
缺点:需要依赖库(paramiko),学习成本稍高

常见问答与避坑指南

Q1:脚本自动配置时,如果目标主机首次未配置SSH怎么办?

:首次部署必须依赖密码认证,可以通过三种方式绕过:

  1. 在脚本中内置默认密码(不安全,不推荐)
  2. 使用sshpass工具(需要安装,且密码以明文传输)
  3. 采用“预先植入策略”:将公钥写入镜像或初始化脚本

Q2:密钥轮换时,如何避免服务中断?

:采用双密钥策略——先添加新公钥,验证通过后再删除旧公钥,在Ansible中可通过exclusive: no参数实现:

- name: 添加新公钥(保留旧密钥)
  authorized_key:
    user: root
    key: "{{ new_key }}"
    exclusive: no

Q3:脚本能否跨平台(Linux/Windows)配置?

:可以,但Windows需要启用OpenSSH服务(Windows Server 2019及以上内置),脚本需分别处理文件路径差异(Windows使用%USERPROFILE%\.ssh)和权限命令差异(Windows使用icacls代替chmod)。

Q4:批量配置时,如何避免脚本卡死在某个故障主机?

:在Shell脚本中添加超时机制和错误处理:

# 超时5秒,若失败则跳过
timeout 5 ssh-copy-id -f user@$host || echo "警告:$host 连接失败,已跳过"

企业级自动化配置最佳实践

1 安全加固策略

  • 禁用根密码登录:配置完成后强制使用密钥登录
  • 密钥指纹验证:首次连接时自动检查并保存主机密钥指纹
  • 定期轮换:设置crontab每月执行密钥更新脚本

2 监控与审计

在脚本中添加日志记录功能:

exec 3>&1 4>&2 > >(tee -a /var/log/ssh_deploy.log) 2>&1
echo "$(date) - 开始部署SSH密钥到主机列表"

3 推荐工具组合

工具 用途 适用场景
Ansible 配置管理+分发 大规模集群(100+主机)
Fabric Python脚本自动化 需要灵活定制的场景
ssh-copy-id 简单公钥分发 小规模服务器(<10台)
Cloud-init 云服务器初始化配置 云原生环境(AWS、阿里云)

4 脚本测试注意事项

  1. 先在隔离环境测试:使用Vagrant或Docker容器验证脚本
  2. 加入回滚机制:在脚本修改authorized_keys前备份旧文件
  3. 进度显示:对大数量主机添加pvrsync进度条

抱歉,评论功能暂时关闭!