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

相关推荐
凡人叶枫20 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
RisunJan20 小时前
Linux命令-pgrep (通过进程名查找进程 ID)
linux·运维
Teacher.chenchong21 小时前
AI-Agent2.0 科研全链路实战营:LLM+NotebookLM + 自动化编程 + 文献管理 + 论文写作,搭建本地科研智能体
人工智能·自动化
信创工程师-小杨21 小时前
Linux内网环境如何解决依赖的问题
linux·运维·服务器
设计师小聂!21 小时前
宝塔 Linux 面板保姆级教程
linux·mysql·开源·运维开发
不吃土豆的马铃薯21 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
java知路1 天前
linux yum 下载docker安装包及依赖安装包,并离线安装
linux·运维·docker
2601_955505251 天前
自然人身份确权可信基础设施赋能 DID 身份合规
运维·金融·区块链·健康医疗·智能硬件·教育电商·政务
fanged1 天前
设备树学习2--一个DTBO实验
linux·嵌入式开发
Maydaycxc1 天前
Codex 配置到落地:从 API 接入到自动化RPA工作流实战
自动化·ai编程·rpa