Ansible可通过Playbook编排SSH主机密钥轮换全流程,涵盖生成(Ed25519)、分发、替换、重启sshd及客户端验证五环节,并借助cron实现定期自动执行。

Ansible 本身不直接管理 SSH 主机密钥(即 /etc/ssh/ssh_host_*.key 文件),但可以通过 Playbook 编排完整轮换流程,配合系统级定时任务实现定期自动更新。关键在于生成、分发、替换、重启与验证五个环节的可控闭环。
准备并统一新主机密钥对
主机密钥必须由系统级工具生成,不能复用用户密钥。推荐使用 Ed25519 类型,兼顾安全性与性能:
- 在 Ansible 控制节点批量生成:
ssh-keygen -t ed25519 -f ./host_key_ed25519 -N "" - 确保生成私钥(
host_key_ed25519)和公钥(host_key_ed25519.pub)存放在 playbook 同级的files/目录下 - 如需兼容旧系统,可额外生成 RSA 或 ECDSA 密钥,一并纳入分发列表
编写密钥轮换 Playbook
核心任务是安全覆盖密钥文件、重设权限、重启服务,并避免意外中断:
- 用
file模块确保/etc/ssh所有者为root,权限为0755 - 用
copy模块推送新密钥对,私钥设owner: root、group: root、mode: '0600';公钥设mode: '0644' - 调用
systemd模块执行systemctl restart sshd,并设置ignore_errors: no保证失败即止 - 可选:用
file模块删除旧密钥备份(如*.old)或保留归档供审计
处理客户端信任与连接验证
密钥变更后,客户端首次连接会因指纹不匹配报错。自动化中需主动应对:
- Playbook 结尾添加
command任务:ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 localhost hostname实现本机自验并自动接受新指纹(仅限可信环境) - 更稳妥方式:提前导出新公钥指纹(
ssh-keygen -lf files/host_key_ed25519.pub),再用known_hosts模块或lineinfile更新所有客户端的~/.ssh/known_hosts - 滚动更新时启用
serial: 3分批执行,并加delay: 10等待服务就绪,降低集群不可用风险
配置定期触发机制
Ansible 是执行引擎,不是调度器。定期运行需依赖系统 cron:
- 在控制节点添加定时任务:
0 2 * * 0 ansible-playbook /opt/ansible/rotate-host-keys.yml --limit=prod-servers -i /etc/ansible/hosts - 建议每周日凌晨执行,避开业务高峰;生产环境可延长周期至每月或每季度
- 配合日志记录(如重定向输出到
/var/log/ansible-hostkey-rotate.log)便于追踪与审计


















