前言
在多主机运维场景下,Ansible 可实现批量配置、软件部署等自动化操作,大幅提升运维效率。本文基于 openEuler 操作系统,使用 Ansible 的 dnf 模块批量安装 httpd 服务,并对执行过程中的警告、报错信息进行详细解读,同时给出优化方案,适合 Linux 运维初学者参考。
一、环境说明
- 控制节点:test01(已安装 Ansible)
- 被管理节点:多台 openEuler 主机(IP 及主机名已配置在 Ansible 清单)
- 模块:Ansible dnf 模块
- 部署软件:httpd(Apache 服务)
二、配置 Ansible 主机清单
编辑 Ansible 默认主机清单文件,添加被管理节点信息:
运行
vim /etc/ansible/hosts

在文件中配置对应主机 IP 或主机名,保存退出即可。
三、执行批量安装 httpd 命令
使用 Ansible 的 dnf 模块,指定安装 httpd 为最新版本,并禁用 source 仓库:
运行
ansible all -m dnf -a "name=httpd state=latest disablerepo=source"



四、执行结果详细解读
1. 执行成功状态:CHANGED
对应主机:192.168.190.143、192.168.190.144、192.168.190.145含义:目标主机未安装过 httpd 及依赖,Ansible 完成全新安装,操作生效。

2. 报错状态:FAILED!
对应主机:test01、test02、test03报错核心信息:软件包xxx已经安装真实含义:并非执行失败,而是目标主机已存在 httpd 及其依赖包,dnf 不允许重复安装,属于正常提示。

3. Python 解释器警告
[WARNING]: Platform linux on host ... is using the discovered Python interpreter

该警告仅为 Ansible 自动识别 Python 路径的提示,不影响任何功能,可直接忽略。
这个警告完全不用管,不影响任何功能!
Ps.你真正想知道的:我成功了吗?
✅ 成功了!
- 远程机器都装上了
- 本地机器本来就有
- 整个批量部署任务达成目标
五、如果你想让 "已安装" 的机器不报错、变绿色(正常)
把命令里的
state=latest
改成
state=present
最终命令:
运行
ansible all -m dnf -a "name=httpd state=present disablerepo=source"
这样:
-
没装 → 安装
-
已装 → 不报错,显示 SUCCESS 绿色
-

-

六、知识补充
Ansible dnf 模块中 state=latest 与 state=present 区别
在使用 Ansible 批量安装软件时,state 参数决定了包管理的最终状态:
- state=latest 表示确保目标软件为最新版本。若软件已安装且为最新版,dnf 会因无法重复安装返回 FAILED 错误;若版本较旧,则自动升级至最新版。适用于批量升级场景。
- state=present 表示仅确保软件已安装即可。若未安装则自动安装,若已安装则不执行任何操作,返回 SUCCESS 绿色状态。适用于环境初始化、批量部署场景。
七、总结
- Ansible dnf 模块可在 openEuler 系统中高效批量部署软件;
- FAILED 不一定是故障,需结合报错信息判断是否为包已存在;
- 使用
state=present可适配更多场景,避免不必要的报错提示; - Python 解释器警告为正常提示,无需处理。