shirely_missA 2025-07-25 16:29 采纳率: 0%
浏览 9

ctyunos适配ambari

ctyunos是修改了/usr/lib/ambari-agent/lib/resource_management/core/providers/package/yumrpm.py文件里关于yum_check_package_available的方法,重写了判断有无包的方法
可以求您一个这个方法么,我现在也再搞这个遇到了同样的问题

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-25 16:30
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    当然可以,以下是对 ctyunos 适配 Ambari 的详细说明,以及你提到的 yum_check_package_available 方法的修改版本。该方法位于 /usr/lib/ambari-agent/lib/resource_management/core/providers/package/yumrpm.py 文件中。


    ✅ 问题背景

    Ambari 中,某些 Linux 发行版(如 CTYUNOS)可能对包管理器(如 yumdnf)的输出格式或行为有所不同,导致 Ambari 在判断某个包是否可用时出现错误。为了适配这些系统,需要对 yum_check_package_available 方法进行定制化修改。


    🔧 修改目标

    • 判断某个 RPM 包是否存在于 YUM/DNF 源中
    • 兼容 CTYUNOS 系统的 YUM 行为

    📌 解决方案(有序列表)

    1. 定位文件路径

      /usr/lib/ambari-agent/lib/resource_management/core/providers/package/yumrpm.py
      
    2. 找到 yum_check_package_available 方法

      通常该方法会使用 subprocess 调用 yumdnf 命令来检查包是否存在。

    3. 原始方法(示例)

      def yum_check_package_available(self, package_name):
          cmd = ['yum', 'list', 'available', package_name]
          try:
              result = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
              return package_name in result.decode('utf-8')
          except Exception as e:
              return False
      
    4. 针对 CTYUNOS 的优化版本

      注意: CTYUNOS 可能使用的是 dnf,但其输出格式可能与标准 CentOS/RHEL 不一致。因此,我们需增强判断逻辑,避免因格式问题导致误判。

      def yum_check_package_available(self, package_name):
          # 使用 dnf 或 yum 命令,尝试获取包信息
          cmd = ['dnf', 'list', 'available', package_name] if self.is_dnf else ['yum', 'list', 'available', package_name]
      
          try:
              result = subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True)
      
              # 处理结果:去除空行、过滤非包名内容
              lines = [line.strip() for line in result.split('\n') if line.strip()]
      
              # 判断是否有匹配的包名
              for line in lines:
                  if line.startswith(package_name):
                      # 检查是否是有效包(例如:不包含 "No such" 或 "Not found")
                      if "No such" not in line and "Not found" not in line:
                          return True
              return False
          except Exception as e:
              return False
      
    5. 添加日志输出(可选)

      为了调试方便,可以在关键步骤加入日志:

      import logging
      LOG = logging.getLogger(__name__)
      
      ...
      
      LOG.debug(f"Checking package availability for: {package_name}")
      LOG.debug(f"Command executed: {' '.join(cmd)}")
      LOG.debug(f"Result: {result}")
      
    6. 测试修改后的代码

      • 重启 Ambari Agent:
        systemctl restart ambari-agent
        
      • 触发安装任务,观察日志和行为是否正常。

    ⚠️ 注意事项

    • 确保命令正确性:根据系统类型(CentOS/CTYUNOS)选择 yumdnf
    • 处理异常情况:如 dnf 命令不存在,应自动降级到 yum
    • 兼容性检查:建议在不同版本的 CTYUNOS 上测试该方法。

    ✅ 总结

    | 项目 | 内容 | |------|------| | 文件位置 | /usr/lib/ambari-agent/lib/resource_management/core/providers/package/yumrpm.py | | 方法名称 | yum_check_package_available | | 优化方向 | 兼容 CTYUNOS 的 yum/dnf 输出格式 | | 代码修改 | 增强日志、异常处理、包名匹配逻辑 |


    如果你有具体的 CTYUNOS 版本或遇到的具体错误信息,我可以进一步帮你调整代码。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月25日