Ansible 主机纳管实践:SSH 认证、Python 兼容性与故障排查
Ansible 主机纳管实践:SSH 认证、Python 兼容性与故障排查
本文主要内容
- Inventory 主机纳管:配置主机清单、节点分组及连接参数。
- SSH 连接验证:通过 Ansible Ping 测试远程连接。
- Python 兼容性排障:定位模块执行失败原因,核对 Ansible 与 Python 版本要求。
- Nexus 软件源与环境适配:批量配置 YUM 源,安装兼容版本的 Python。
- SSH 免密认证:生成 SSH 密钥、批量分发公钥,实现免密登录。
- 最终验收:验证三台节点的 Ansible 远程管理能力。
阅读提示: 如果被管理节点的 Python 版本已满足当前 Ansible 要求,且 Ping 模块执行正常,可跳过第四章,直接阅读第五章 SSH 免密认证。
一、实验环境与实施目标
本次基于已有的 Kubernetes 三节点实验环境,通过 Ansible 统一管理 Linux 服务器,完成主机纳管、SSH 身份认证及远程连接验证。
实验环境:
| 项目 | 配置 |
|---|---|
| 操作系统 | openEuler 20.03 LTS-SP4 |
| Ansible | ansible-core 2.21.5 |
| 控制节点 Python | 3.12.12 |
| 被管理节点 Python | 3.7.9 |
| 连接协议 | SSH |
| 主机数量 | 3 台 |
实施流程:
配置 Inventory
│
▼
Ansible Ping 初测
│
├── SSH 认证失败 → 排查 known_hosts / 密码 / 密钥
│
└── Python 模块执行失败 → 检查远程 Python
│
▼
环境兼容性处理
│
▼
统一验收
本次不仅验证服务器能否通过 SSH 连接,还需要确认远程 Python 环境能够正常执行 Ansible 模块。
二、配置 Inventory 主机清单
Inventory 用于定义被管理服务器、主机分组及连接参数。
1. 创建主机清单
文件:/opt/ansible/inventory/hosts.ini
# 主机分组
[master]
m1 ansible_host=192.168.2.120
[worker]
w1 ansible_host=192.168.2.121
w2 ansible_host=192.168.2.122
# 父子组
[k8s:children]
master
worker
# 组变量
[k8s:vars]
ansible_user=root
ansible_port=22
2. 常用参数速查
| 参数 | 作用 |
|---|---|
ansible_host | 实际连接 IP |
ansible_user | SSH 登录用户 |
ansible_port | SSH 端口 |
ansible_password | SSH 登录密码 |
ansible_ssh_private_key_file | SSH 私钥路径 |
ansible_python_interpreter | 远程 Python 解释器路径 |
[group:vars] | 设置组变量 |
[group:children] | 定义父子组关系 |
生产环境不建议将 SSH 密码明文保存在主机清单中。
3. 查看 Inventory 解析结果
ansible-inventory -i inventory/hosts.ini --graph

通过主机拓扑确认 master、worker 已被正确归入 k8s 组。
三、Ansible Ping 初测与故障定位
【 测试连接是否正常 】
1. 首次执行远程连接测试
在控制节点执行:
ansible all -i inventory/hosts.ini -m ping -k
参数:
all:所有被管理节点。-i:指定主机清单。-m ping:执行 Ansible Ping 模块。-k:交互输入 SSH 登录密码。
【报错】

通过报错提示得知两个信息:
- 远程 Python 无法识别当前代码语法
- 这里的
/是 Python 3.8 引入的位置参数专用语法,低版本 Python 无法解析。
结论: 怀疑被控节点 Python 版本与当前 Ansible 不兼容
【解决】
首先确认控制节点 Ansible 版本:
ansible --version
本次环境:
ansible [core 2.21.5]
python version = 3.12.12
再通过 raw 模块查询被管理节点 Python:
(raw 模块 不依赖远程Python ,Ansible 通过ssh登录远端,执行linux命令)
ansible all -i inventory/hosts.ini -m raw -a "python3 --version; command -v python3" -k |grep -E 'Python|rc'
(-a : 指定要执行的命令)
本次三台节点实际返回:
m1 | CHANGED | rc=0 >>
Python 3.7.9
w2 | CHANGED | rc=0 >>
Python 3.7.9
w1 | CHANGED | rc=0 >>
Python 3.7.9
使用 raw 是因为它通过 SSH 直接执行命令,不依赖远程 Python 模块环境。
常见版本对应关系:
| Ansible Core | 控制节点 Python | 被管理节点 Python |
|---|---|---|
| 2.17 | 3.10~3.12 | 3.7~3.12 |
| 2.18 | 3.11~3.13 | 3.8~3.13 |
| 2.19 | 3.11~3.13 | 3.8~3.13 |
| 2.20 | 3.12~3.14 | 3.9~3.14 |
| 2.21 | 3.12~3.14 | 3.9~3.14 |
官方文档:https://docs.ansible.com/projects/ansible/latest/reference_appendices/release_and_maintenance.html
进入页面,查找:
ansible-core support matrix
四、通过 Ansible 批量配置 Nexus YUM 软件源
问题: 三台被管理节点均为 Python 3.7.9,不兼容 Ansible Core 2.21.5。
处理思路: 通过 raw 模块批量配置 Nexus 软件源,安装 Python 3.12,保留系统原有 Python。
1. 批量配置 Nexus 软件源
在控制节点创建 files/nexus.repo:
# pwd
/opt/ansible
# mkdir files
# cp /etc/yum.repos.d/nexus.repo files/nexus.repo
将本地地址替换为 Nexus 内网 IP
sed -i "s/127\.0\.0\.1/192.168.2.111/g" files/nexus.repo

2. 通过 Ansible 分发给三台节点
因为三台服务器的 Python 3.7.9 暂时不兼容 Ansible Core 2.21.5,所以继续使用 raw
( 当前路径: /opt/ansible)
for ip in 192.168.2.120 192.168.2.121 192.168.2.122; do
scp files/nexus.repo root@$ip:/etc/yum.repos.d/
done

传输后使用Ansible做统一验证
ansible all -i inventory/hosts.ini -k -m raw \
-a "dnf --disablerepo='*' --enablerepo=nexus-openeuler-os --enablerepo=nexus-openeuler-epol makecache"

1. 先在 w1 安装编译依赖
【建议】
先在 w1 验证一次。成功后,剩余节点可以通过 Ansible 批量安装。
ansible w1 -i inventory/hosts.ini -k -m raw \
-a "dnf install -y gcc make openssl-devel zlib-devel libffi-devel bzip2-devel readline-devel sqlite-devel xz-devel"

2. 检查 OpenSSL 版本
ansible w1 -i inventory/hosts.ini -k -m raw -a "openssl version"
Python 3.12 要求 OpenSSL ≥ 1.1.1。

3. 分发 Python 源码
mkdir -p packages
wget https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tgz \
-P packages/
控制节点已有 Python-3.12.12.tgz 的话,进入其所在目录执行:
scp packages/Python-3.12.12.tgz root@192.168.2.121:/opt/
4. 通过 Ansible 编译安装
(执行下面命令成功在安装其他节点后端 需要把下面命令 w1 改成其他的主机名称 )
ansible w1 -i inventory/hosts.ini -k -m raw \
-a "mkdir -p /opt/src && tar -xzf /opt/Python-3.12.12.tgz -C /opt/src && cd /opt/src/Python-3.12.12 && ./configure --prefix=/opt/python3.12 --with-ensurepip=install && make -j2 && make altinstall"

5. 验证
检查 Ansible:
ansible w1 -i inventory/hosts.ini -k \
-e ansible_python_interpreter=/opt/python3.12/bin/python3.12 \
-m ping
w1 成功后,再安装 w2、m1:
安装其他节点编译依赖:
ansible 'w2,m1' -i inventory/hosts.ini -k -m raw \
-a "dnf install -y gcc make openssl-devel zlib-devel libffi-devel bzip2-devel readline-devel sqlite-devel xz-devel"
分发源码:
for ip in 192.168.2.122 192.168.2.120; do
scp packages/Python-3.12.12.tgz root@$ip:/opt/
done
顺序编译安装
ansible 'w2,m1' -i inventory/hosts.ini -k -f 1 -m raw \
-a "mkdir -p /opt/src && tar -xzf /opt/Python-3.12.12.tgz -C /opt/src && cd /opt/src/Python-3.12.12 && ./configure --prefix=/opt/python3.12 --with-ensurepip=install && make -j2 && make altinstall"
最后统一验收一次,先在 inventory/hosts.ini 的 [k8s:vars] 添加:
ansible_python_interpreter=/opt/python3.12/bin/python3.12

再执行:
ansible all -i inventory/hosts.ini -k -m ping
三台返回 pong 即完成。

五、SSH 密钥认证与最终验收
前面已完成 Inventory 配置、Python 环境适配及 Ansible Ping 验证。目前仍需通过 -k 输入 SSH 密码,接下来配置 SSH 公钥认证,实现免密管理。
1. 控制节点生成 SSH 密钥
在 Ansible 控制节点执行:
ssh-keygen -t ed25519
默认生成两个文件:
| 文件 | 作用 |
|---|---|
~/.ssh/id_ed25519 | 私钥,保存在控制节点 |
~/.ssh/id_ed25519.pub | 公钥,分发到被管理节点 |
实验环境可以不设置密钥口令;生产环境建议设置口令并配合 ssh-agent 使用。

2. 批量分发 SSH 公钥
通过 ssh-copy-id 将公钥分发到三台节点:
for ip in 192.168.2.120 192.168.2.121 192.168.2.122; do
ssh-copy-id root@$ip
done
首次分发需要输入各节点的 SSH 密码。

关键返回:
Number of key(s) added: 1
说明公钥已成功添加到目标用户的 ~/.ssh/authorized_keys 文件。
注意:公钥分发成功不等于免密认证已经验证成功,还需要实际测试。
3. 最终验证 Ansible 免密连接
不再使用 -k,直接执行:
ansible all -i inventory/hosts.ini -m ping

验收依据:
| 检查项 | 成功标准 |
|---|---|
| SSH 认证 | 无需输入 SSH 登录密码 |
| Ansible 执行 | 三台节点均返回 SUCCESS |
| Python 模块 | 三台节点均返回 "ping": "pong" |
六、实践总结
本次完成了 Kubernetes 三节点的 Ansible 纳管,处理了远程 Python 版本不兼容问题,并通过 SSH 公钥认证实现免密管理。
实施流程:
Inventory 主机清单
↓
SSH 密码连接
↓
Ansible Ping 报错
↓
raw 定位 Python 兼容性问题
↓
Nexus 软件源与 Python 环境适配
↓
SSH 公钥分发
↓
Ansible 免密 Ping 验收
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)