在运维日常中,管理多台服务器时反复输入 SSH 密码不仅低效,还存在明文密码泄露的风险。而 Ansible 作为主流的自动化运维工具,免密登录是实现批量操作的基础前提------ 它能让控制节点无需人工干预,直接安全地连接所有被控节点执行任务。
这篇文章会手把手带你完成 Ansible 的 SSH 免密登录配置:从密钥对生成、公钥分发,到 Ansible 主机清单的安全优化,再到常见问题的排查,帮你彻底摆脱 "重复输密码" 的麻烦,为后续的批量部署、配置管理打好基础。
配置免密登录
在Ansible 控制节点 生成 SSH 密钥对 → 将公钥复制到所有被控节点 → 修改 Ansible 主机清单,删除明文密码配置,改用密钥认证。
步骤 1:在控制节点生成 SSH 密钥对
登录 Ansible 控制节点(安装了 ansible 的服务器),执行以下命令:
# 生成RSA密钥对(一路回车,不要设置密钥密码,否则Ansible自动连接时仍需手动输入)
ssh-keygen -t rsa -b 2048 -f ~/.ssh/ansible_rsa
-t rsa:指定密钥类型为 RSA(最常用);-b 2048:密钥长度(安全性足够);-f ~/.ssh/ansible_rsa:指定密钥保存路径(也可默认~/.ssh/id_rsa,建议自定义命名更易区分)。
执行后会生成两个文件:
~/.ssh/ansible_rsa:私钥(控制节点保存,切勿泄露);~/.ssh/ansible_rsa.pub:公钥(需要复制到所有被控节点)。
步骤 2:将公钥复制到被控节点
有两种方式,推荐用ssh-copy-id(更便捷):
方式 1:用 ssh-copy-id 自动复制(需临时输入被控节点密码)
# 复制公钥到81节点(替换为你的被控节点IP)
ssh-copy-id -i ~/.ssh/ansible_rsa.pub root@192.168.163.81
# 复制公钥到82节点
ssh-copy-id -i ~/.ssh/ansible_rsa.pub root@192.168.163.82
执行后会提示输入被控节点的 root 密码(即之前的 huang123),输入后公钥会自动添加到被控节点的~/.ssh/authorized_keys文件中。

方式 2:手动复制(适用于 ssh-copy-id 不可用的场景)
# 1. 先把公钥文件传到被控节点
scp ~/.ssh/ansible_rsa.pub root@192.168.163.81:/tmp/
# 2. 登录被控节点,将公钥添加到authorized_keys
ssh root@192.168.163.81
cat /tmp/ansible_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys # 必须设置权限,否则SSH会拒绝认证
chmod 700 ~/.ssh
rm -rf /tmp/ansible_rsa.pub # 删除临时文件
exit
# 对82节点重复上述操作
步骤 3:修改 Ansible 主机清单,删除明文密码
编辑/etc/ansible/hosts文件,修改为以下内容(删除 ansible_ssh_pass,新增私钥路径):
# 方式1:单IP+变量
192.168.163.81 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_private_key_file=/root/.ssh/ansible_rsa
192.168.163.82 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_private_key_file=/root/.ssh/ansible_rsa
# 方式2:分组配置(更规范)
[servers]
192.168.163.81
192.168.163.82
[servers:vars]
ansible_ssh_user=root
ansible_ssh_port=22
ansible_ssh_private_key_file=/root/.ssh/ansible_rsa
步骤 4:测试免密登录是否生效
# 测试Ansible连接(无需输入密码)
ansible all -m ping
如果返回pong,说明配置成功;如果报错,优先检查:
- 被控节点
~/.ssh/authorized_keys的权限是否为 600; - 控制节点私钥
ansible_rsa的权限是否为 600; - 私钥路径是否填写正确。
如果 ssh 还需要密码,ssh 不能免密操作
登录被控节点检查公钥文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
如果权限正常,仍需要密码,进行下面操作
步骤 1:确认控制节点的私钥与被控节点的公钥一致
-
在控制节点(hjc01) 查看公钥内容:
cat ~/.ssh/ansible_rsa.pub
-
在被控节点(192.168.163.81) 查看
authorized_keys内容:cat ~/.ssh/authorized_keys
-
对比两者是否完全一致(若不一致,说明公钥复制错误,需重新复制)。
步骤 2:强制指定私钥进行 SSH 连接
在控制节点(hjc01) 执行时,显式指定私钥路径(避免 SSH 默认使用其他密钥):
ssh -i ~/.ssh/ansible_rsa root@192.168.163.81 'du -sh'
- 若此命令仍需密码 → 公钥 / 私钥不匹配,或被控节点
sshd配置有隐藏限制; - 若此命令成功 → 说明 SSH 默认未加载
ansible_rsa私钥,需在控制节点配置~/.ssh/config。
步骤 3:配置控制节点的~/.ssh/config(可选,解决默认密钥问题)
在控制节点(hjc01) 创建 / 编辑~/.ssh/config:
vim ~/.ssh/config
添加以下内容:
Host 192.168.163.81
User root
IdentityFile ~/.ssh/ansible_rsa
保存后设置权限:
chmod 600 ~/.ssh/config
之后直接执行ssh 192.168.163.81 'du -sh'即可自动使用指定私钥。
