Ansible不直接管理SSH主机密钥,但可编排“生成→分发→替换→重启→验证”全流程:控制节点预生成Ed25519密钥,原子化推送至目标机并设权限,重启sshd,同步更新客户端known_hosts,分批滚动执行,并通过cron每周自动触发。

Ansible 本身不直接管理 SSH 主机密钥文件(如 /etc/ssh/ssh_host_*.key),但它能完整编排“生成 → 分发 → 替换 → 重启 → 验证”整条链路,实现安全、可回退、服务不中断的自动化密钥管理。关键在于统一预生成、原子化替换、主动同步客户端指纹,而非临时操作或手动干预。
提前集中生成合规主机密钥
必须在控制节点上批量生成,禁止在目标机上现场生成或复用用户密钥。推荐使用 Ed25519 算法,兼顾安全性与性能:
- 运行命令:
ssh-keygen -t ed25519 -f ./host_key_ed25519 -N ""(空密码,便于自动化) - 生成两个文件:
host_key_ed25519(私钥)、host_key_ed25519.pub(公钥) - 将这两个文件放入 playbook 同级的
files/目录下,供copy模块直接引用 - 如需兼容旧系统,可额外生成 RSA 密钥,但主用 Ed25519 即可
编写原子化密钥轮换 Playbook
确保替换过程安全可靠,避免服务中断或权限错误:
- 用
copy模块推送私钥至/etc/ssh/ssh_host_ed25519_key,设置owner: root、group: root、mode: '0600' - 同理推送公钥至
/etc/ssh/ssh_host_ed25519_key.pub,设mode: '0644' - 用
systemd模块执行systemctl restart sshd,并配置ignore_errors: no,确保失败立即中止 - 可选:用
file模块清理旧备份(如带.old后缀的文件)
主动同步客户端 known_hosts
密钥更换后,客户端首次连接会报错 REMOTE HOST IDENTIFICATION HAS CHANGED!。不能依赖人工确认,必须自动化处理:
- 生产环境推荐方式:用
ssh-keygen -lf files/host_key_ed25519.pub提前导出新指纹,在 Playbook 中调用known_hosts模块,批量更新各客户端的~/.ssh/known_hosts - 测试环境快速验证:在 Playbook 末尾加
command任务,执行ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 localhost,自动接受新指纹 - 避免全量中断:设置
serial: 3分批滚动更新,并加delay: 10等待 sshd 就绪
配置定期自动执行机制
Ansible 是执行引擎,不是调度器。定期触发需借助系统级定时任务:
- 在控制节点执行
crontab -e,添加一行:0 2 * * 0 ansible-playbook /opt/ansible/rotate-host-keys.yml --limit=prod-servers -i /etc/ansible/hosts --log-path=/var/log/ansible/hostkey-rotate.log - 该配置表示每周日凌晨 2 点执行,仅作用于
prod-servers主机组,日志落盘便于审计 - 建议 playbook 中启用日志记录,方便排查异常和合规留痕

















