Ansible 自动化运维:从 “手动输密码” 到 “一键免密管理”

在运维日常中,管理多台服务器时反复输入 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:确认控制节点的私钥与被控节点的公钥一致
  1. 控制节点(hjc01) 查看公钥内容:

    cat ~/.ssh/ansible_rsa.pub

  2. 被控节点(192.168.163.81) 查看authorized_keys内容:

    cat ~/.ssh/authorized_keys

  3. 对比两者是否完全一致(若不一致,说明公钥复制错误,需重新复制)。

步骤 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'即可自动使用指定私钥。

相关推荐
70asunflower11 小时前
用Docker创建不同的容器类型
运维·docker·容器
wdfk_prog11 小时前
[Linux]学习笔记系列 -- [drivers][tty]sysrq
linux·笔记·学习
2501_9336707911 小时前
中专学财务,2026年就业方向全解析:从出纳到财务BP的进阶路
运维·服务器
c++逐梦人11 小时前
Linux基础IO
linux·操作系统·io
blueSatchel11 小时前
U-Boot载入到DDR过程的代码分析
linux·开发语言·u-boot
专注VB编程开发20年11 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
Dovis(誓平步青云)11 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
迎仔11 小时前
05-计算设备运维进阶:算力中心的设备医生
运维
石去皿12 小时前
【嵌入式就业10】Linux内核深度解析:从启动流程到驱动框架的工业级实践
linux·运维·服务器
954L12 小时前
CentOs7执行yum update出现链接404问题
linux·centos·yum·vault