ansible可编排ssh主机密钥全生命周期管理:统一生成ed25519密钥、原子化分发替换、权限校准、sshd重启及指纹验证,并通过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 或 ECDSA 密钥,但建议主用 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模块清理旧备份(如state=absent删除.old后缀文件)
处理客户端指纹变更问题
密钥一换,所有客户端首次连接都会报 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!。自动化中需主动应对:
- 方式一(快速验证用):在 playbook 末尾加
command任务,运行ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 localhost,自动接受新指纹(仅限测试环境) - 方式二(生产推荐):用
ssh-keygen -lf /path/to/host_key_ed25519.pub提前导出新指纹,再通过known_hosts模块批量更新各客户端的~/.ssh/known_hosts - 避免全量中断:在 playbook 中配置
serial: 3实现分批滚动更新,并加delay: 10等待服务就绪
配置每周自动执行机制
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加速执行,因密钥轮换无需采集系统信息











