Ansible批量分发SSH公钥的核心是authorized_key模块,通过playbook将本机ed25519公钥自动写入目标主机~/.ssh/authorized_keys,首次需密码或密钥登录,之后实现免密管理。

用 Ansible 批量分发 SSH 公钥,核心是借助 authorized_key 模块,通过 playbook 自动把本机公钥写入目标主机的 ~/.ssh/authorized_keys 文件。整个过程不需要手动输密码(首次执行需凭密码或密钥登录),之后即可实现免密管理。
准备本机 SSH 密钥对
确保控制节点已生成可用的密钥对,推荐使用更安全的 ed25519 算法:
- 运行
ssh-keygen -t ed25519 -C "ansible-control",一路回车使用默认路径(~/.ssh/id_ed25519) - 确认公钥存在:
ls -l ~/.ssh/id_ed25519.pub - 若已有密钥但不确定是否分发过,可先备份原公钥或检查内容
配置 Inventory 主机清单
在 inventory 文件(如 inventory.ini)中定义目标主机,并明确登录凭据(仅首次分发需要):
- 指定用户和明文密码(测试环境可用):
[web]<br>192.168.1.10 ansible_user=ubuntu ansible_password=mypass
- 或指定用户和私钥路径(生产环境更安全):
192.168.1.11 ansible_user=centos ansible_ssh_private_key_file=~/.ssh/id_rsa - 支持主机组、变量继承,例如统一设置
[all:vars]下的ansible_user
编写并执行分发 playbook
创建 push-ssh.yml,内容如下:
- hosts: all
gather_facts: no
tasks:
- name: 读取本地公钥文件
set_fact:
pub_key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
<pre class="brush:php;toolbar:false;">- name: 将公钥添加到远程用户 authorized_keys
authorized_key:
user: "{{ ansible_user }}"
key: "{{ pub_key }}"
state: present
manage_dir: yes
-
manage_dir: yes保证自动创建~/.ssh目录并设为700权限 -
user必须与 inventory 中的ansible_user一致,不能硬写root(除非确定所有目标都用 root) - 执行命令:
ansible-playbook -i inventory.ini push-ssh.yml
验证与后续清理
分发成功后建议快速验证,并更新 inventory 去除密码字段:
- 手动测试一两台:
ssh -o ConnectTimeout=5 ansible_user@192.168.1.10 hostname - 批量验证连通性:
ansible all -i inventory.ini -m ping - 确认无误后,从 inventory 中删掉
ansible_password行,改用密钥认证,提升安全性 - 如需覆盖原有公钥(慎用),可在
authorized_key中加exclusive: yes


















