httpd-devel 与服务无关

根据您描述的情况,结合命令和现象分析,结论和建议如下:


1. 核心结论

您的推测正确httpd-devel 对应的不是 httpd 服务,两者属于不同的功能模块:

  • httpd:是 Apache 的核心服务包,包含主程序文件(如 /usr/sbin/httpd)和配置文件,负责 Web 服务的运行。
  • httpd-devel:是开发工具包,提供编译模块或二次开发所需的头文件、静态库等,与服务运行无关

2. 为什么卸载 httpd 后服务仍存在?

可能原因
  • httpd 未完全卸载

    • 检查是否因参数错误、权限不足或缓存问题导致卸载失败。
    • 验证方式:
      # 检查 httpd 包是否还存在
      rpm -q httpd
      # 或查看二进制文件是否存在
      ls /usr/sbin/httpd
      
    • 如果包未卸载,可能是 Ansible 任务执行失败或系统配置问题。
  • 服务文件残留但实际已失效

    • 即使卸载了 httpd,系统的服务单元文件(如 /usr/lib/systemd/system/httpd.service)可能仍存在,但服务已无法启动(因缺少主程序)。
    • 验证方式:
      # 尝试启动服务
      systemctl start httpd
      # 观察是否有报错提示找不到二进制文件
      
  • 其他 Web 服务干扰

    • 部分系统可能默认安装其他 Web 服务(如 nginx 或 Lighttpd),需确认是否是其他服务在运行。

3. 如何彻底终止 httpd 服务?

如果目标是停止服务而非卸载软件包,可以显式调用 Ansible 的 service 模块:

- name: Stop and disable httpd serviceservice:name: httpdstate: absent  # 或 disabled,具体取决于需求

4. 补充说明

  • state=absent 的行为差异

    • yum 模块的 state=absent:仅卸载软件包,不直接管理服务状态。
    • service 模块的 state=absent:会停止并禁用服务(更彻底)。
  • 开发包与服务的关系

    • httpd-devel 仅用于编译模块或源码安装,与服务运行无关。即使卸载它,只要 httpd 存在,服务仍可运行。

5. 推荐操作步骤

  1. 验证 httpd 是否真正卸载
    rpm -qa | grep httpd
    
  2. 若未卸载成功,重新执行 Ansible 任务:
    - name: Ensure httpd is uninstalledyum:name: httpdstate: absent
    
  3. 若已卸载但服务仍显示存在,强制删除服务文件:
    sudo systemctl daemon-reload
    sudo systemctl reset-failed httpd  # 清理服务状态
    

通过以上分析,您可以明确 httpd-devel 与服务无关,重点应检查 httpd 包的卸载情况和服务的实际状态。