Ansible 主机纳管实践:SSH 认证、Python 兼容性与故障排查

本文主要内容

  1. Inventory 主机纳管:配置主机清单、节点分组及连接参数。
  2. SSH 连接验证:通过 Ansible Ping 测试远程连接。
  3. Python 兼容性排障:定位模块执行失败原因,核对 Ansible 与 Python 版本要求。
  4. Nexus 软件源与环境适配:批量配置 YUM 源,安装兼容版本的 Python。
  5. SSH 免密认证:生成 SSH 密钥、批量分发公钥,实现免密登录。
  6. 最终验收:验证三台节点的 Ansible 远程管理能力。

阅读提示: 如果被管理节点的 Python 版本已满足当前 Ansible 要求,且 Ping 模块执行正常,可跳过第四章,直接阅读第五章 SSH 免密认证。

一、实验环境与实施目标

本次基于已有的 Kubernetes 三节点实验环境,通过 Ansible 统一管理 Linux 服务器,完成主机纳管、SSH 身份认证及远程连接验证。

实验环境:

项目配置
操作系统openEuler 20.03 LTS-SP4
Ansibleansible-core 2.21.5
控制节点 Python3.12.12
被管理节点 Python3.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_userSSH 登录用户
ansible_portSSH 端口
ansible_passwordSSH 登录密码
ansible_ssh_private_key_fileSSH 私钥路径
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 登录密码。

【报错】
在这里插入图片描述

通过报错提示得知两个信息:

  1. 远程 Python 无法识别当前代码语法
  2. 这里的 / 是 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.173.10~3.123.7~3.12
2.183.11~3.133.8~3.13
2.193.11~3.133.8~3.13
2.203.12~3.143.9~3.14
2.213.12~3.143.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![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/afe4ab8dcbb1469ab6d39faf7dc7fbae.png)

在这里插入图片描述

再执行:

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 验收
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐