ansible可自动化完成ssh主机密钥的生成、分发、替换、重启与验证全流程,并通过cron实现定期轮换;需在控制节点预生成ed25519密钥,原子化推送至目标机,同步更新客户端known_hosts,分批滚动更新并记录日志。

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
核心是确保替换过程安全、可回退、服务不中断。以 Ed25519 为例:
- 用
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后缀的文件)
主动处理客户端指纹变更
密钥一换,所有客户端首次连接都会报错 REMOTE HOST IDENTIFICATION HAS CHANGED!。不能靠人工点 yes,必须自动化应对:
- 生产环境推荐方式:用
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 不是调度器,需依赖系统 cron 触发:
- 在控制节点执行
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 中启用
gather_facts: false加速执行(因密钥轮换无需采集主机事实)










