ambari在kylin-v10适配

ambari适配遇到的问题

此次系统适配的是国产kylin-v10系统(是系统非Apache-kylin),内核是4.19(仿centos8),yum的版本4.2(由python2转变为python3,由yum转变为dnf.yum,这就意味着依赖centos8之前的软件,在centos8的yum的api无法使用)。
通过尝试发现
1.agent的 yum_manager.py 的函数yum_check_package_available无法通过yum的api获取以安装的rpm包。
2.agent 无法获取${stack_version}的对应版本。
3.agent无法获取yum源的base_url地址。
4.kylin系统不被ambari所支持。

ambari修改思路

安装是由ambari-agent请求server端的api返回的 command.json去执行相应的job,因此只需要修改返回的value就可以修改因版本不匹配,yum源无法获取等问题。

ambari相关代码位置的修改

此版本适配的是ambari-2.7.3,hadoop版本是3_1_0_0。
由于初版,仅为实现功能,有些地方是写死的,后期需要进一步优化。代码有不足的地方,仅供参考, 欢迎来提改进意见。
相关rpm包已经打好:ambari-agent

涉及相关脚本及对应位置

ambari-agentambari-server
/var/lib/ambari-server/resources/stack-hooks/before-INSTALL/scripts/params.py
/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py/usr/lib/ambari-server/lib/ambari_commons/repo_manager/yum_manager.py
/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py/usr/lib/ambari-server/lib/resource_management/libraries/script/script.py
/usr/lib/ambari-agent/lib/ambari_commons/os_check.py/usr/lib/ambari-server/lib/ambari_commons/os_check.py
/usr/lib/ambari-agent/lib/resource_management/core/providers/system.py/usr/lib/ambari-server/lib/resource_management/core/providers/system.py

params.py

此类是公共类script获取conf的地方

#原版
repo_file = default("/repositoryFile",None)
##############################################
#新版
middle_test = default("/repositoryFile",None)
#定义获取repo的key及value
def explain(repo_file):   
  groups_dict={}
  with open (repo_file,"rb") as f:
    for line in f:
      if line.startswith("#") or line.startswith(";") or len(line.strip()) == 0:
        continue
      if line.strip().find('[') == 0 and line.strip().find(']') == len(line.strip()) - 1:
        key = line.strip().lstrip('[').rstrip(']')
        groups_dict[key] = []
      else:
        if line.strip().find('baseurl') != -1:
          groups_dict[key].append(line.strip().split('=')[1])
  return groups_dict

#方便获取repo文件的base_url
middle_list=[]
middle_dict={}
for i in middle_test['repositories']:
  if i['repoName']=="HDP":
    i['baseUrl']="".join(explain('/etc/yum.repos.d/hdp.repo')['HDP-3.1'])
  elif i['repoName']=="HDP-UTILS":
    i['baseUrl']="".join(explain('/etc/yum.repos.d/hdp.repo')['HDP-UTILS-1.1.0.22'])
  elif i['repoName']=="GPL":
    i['baseUrl']="".join(explain('/etc/yum.repos.d/hdp.repo')['HDP-3.1-GPL'])
  middle_list.append(i)
middle_dict['repositories']=middle_list
middle_dict['middle_repoVersion']='false'
middle_dict['repoVersion']="3.1"
repo_file=middle_dict

yum_manager.py

cmd包安装,repolist校验,校验安装包是否被安装等

#由于api无法使用因此cmd去查询是否存在对应安装包
  def yum_check_package_available(self, name):
    """
    Does the same as rpm_check_package_avaiable, but faster.
    However need root permissions.
    """
    #r=shell.subprocess_executor("/usr/bin/yum list installed|awk '{print $1}'")
    #if name.find("stack_version") != -1:
    #  name=name.replace("${stack_version}","3_1_0_0_78")
    #with suppress_stdout():
    #  package_list = r.out.split()
    #for package in package_list:
    #  if package.find(name) != -1:
    #    return True
    #return False
    #11/03修改匹配规则
    r=shell.subprocess_executor("/usr/bin/yum list installed|awk '{print $1}'")
    if name.find("stack_version") != -1:
      name=name.replace("${stack_version}","3_1_0_0_78")
    with suppress_stdout():
      package_list = r.out.split()
    for package in package_list:
      if package[0:package.rfind('.', 1)] == name:
      #if package.find(name) != -1:
        return True
    return False
    
  #install_package函数 由于name的stack_version无法获取因此写死了 不然yum无法安装
name=name.replace("${stack_version}","3_1_0_0_78") 

script.py

#此处版本写死了
STACK_VERSION_PLACEHOLDER = "3_1_0_0_78"

os_check.py

#版本的获取是通过platform获取的,我们仿照centos7.8修改 如果你有redhat-release, _is_redhat_linux()返回true
 if PYTHON_VER < 26:
        distribution = platform.dist()
      elif _is_redhat_linux():
        distribution = ('centos','7.8.2003','AltArch')
        #platform.dist()
      else:
        distribution = ('centos','7.8.2003','AltArch')

system.py

此函数是校验文本是否相同,如果不相同就将新版本配置文件覆盖,此函数是公共函数,因此仅当匹配到替换源时才交write返回false.

  def action_create(self):
    path = self.resource.path

    if sudo.path_isdir(path):
      raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path))

    dirname = os.path.dirname(path)
    if not sudo.path_isdir(dirname):
      raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname))

    write = False
    content = self._get_content()
    if not sudo.path_exists(path):
      write = True
      reason = "it doesn't exist"
    elif self.resource.replace:
      if content is not None:
        old_content = sudo.read_file(path, encoding=self.resource.encoding)
        Checkrepo=content
        hdprepo="HDP-3.1-repo"
        hdputil="HDP-UTILS-1.1.0.22-repo"
        if isinstance(content,unicode):
          Checkrepo=Checkrepo.encode()
        if Checkrepo.find(hdprepo) != -1 and Checkrepo.find(hdputil) != -1:
          write = False
          old_content = content
        if content != old_content:
          write = True
          reason = "contents don't match"
          if self.resource.backup:
            self.resource.env.backup_file(path)

界面生成截图

此为安装好的界面
此为后台进程

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值