Ansible 不直接管理 SSH 主机密钥,但可通过 playbook 编排轮换流程:生成 ed25519 密钥、copy 分发、设权限、restart sshd、分批执行并定期 cron 触发。

Ansible 本身不直接管理 SSH 主机密钥(即 /etc/ssh/ssh_host_*.key 文件),它默认聚焦于用户层的 SSH 免密登录(如 authorized_key 模块)。但你可以用 Ansible 编排完整的主机密钥轮换流程——包括生成新密钥、替换旧文件、重启服务、验证连通性,再配合定时任务实现“定期更新”。
准备新主机密钥对
SSH 主机密钥由系统生成,不能复用用户密钥。需在 Ansible 控制节点上提前批量生成(或用脚本生成),并确保格式合规:
- 支持的类型:rsa(2048/4096)、ecdsa(256/384/521)、ed25519(推荐)
- 建议统一使用
ssh-keygen -t ed25519 -f ./host_key_ed25519 -N ""生成无密码密钥对 - 把公钥(
host_key_ed25519.pub)和私钥(host_key_ed25519)放入 playbook 同级的files/目录下,便于分发
编写轮换 playbook
核心是覆盖 /etc/ssh/ssh_host_*.key 及对应 .pub 文件,并重设权限。以下为关键任务示例(以 ed25519 为主,可扩展其他类型):
-
确保目标目录可写:用
file模块确认/etc/ssh/所有者为 root,权限为 755 -
分发新密钥文件:
copy模块推送私钥与公钥,设置owner: root、group: root、mode: '0600'(私钥)或'0644'(公钥) -
重启 SSH 服务:
systemd模块执行systemctl restart sshd,并加ignore_errors: no确保失败中断 -
可选:清理旧密钥备份(如保留
.old副本)可用file: state=absent删除
处理连接中断与验证环节
更换主机密钥后,客户端首次连接会因指纹变更报错(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)。自动化中需主动应对:
- 在 playbook 末尾加入
command任务,用ssh -o StrictHostKeyChecking=no连接本机一次,自动接受新指纹(仅用于验证,非生产推荐) - 更稳妥方式:将新主机公钥指纹提前导出(
ssh-keygen -lf /path/to/host_key_ed25519.pub),更新至所有客户端的~/.ssh/known_hosts——这本身也可用 Ansible 的lineinfile或known_hosts模块完成 - 避免滚动更新时全量中断:可按主机组分批执行(如
serial: 3),并加delay: 10等待服务就绪
配置定期执行机制
Ansible 是执行引擎,不是调度器。定期触发需借助系统级定时任务:
- 在控制节点上用
crontab -e添加: 0 2 * * 0 ansible-playbook /opt/ansible/rotate-host-keys.yml --limit=prod-servers -i /etc/ansible/hosts (每周日凌晨 2 点执行,限制只操作 prod-servers 组) - 建议 playbook 中启用日志记录:
--log-path=/var/log/ansible/hostkey-rotate.log - 配合
check_mode: no和错误回调(如邮件通知)提升可观测性


















