解决-增加系统支持范围(四)已完结
version_definition 专题
本章节的修改位置如下:
ambari-server/src/main/resources/version_definition.xsd
# 一、章节引导 终章
经历了前三节的内容,我们已经实现了以下目标:
| 模块 | 作用 | 状态 |
|---|---|---|
| OSCheck | 识别 Kylin 系统类型 | ✅ 已完成 |
| os_family.json | 建立家族继承关系 | ✅ 已完成 |
| repoinfo.xml | 增加镜像源定义 | ✅ 已完成 |
至此,Ambari 已能识别 Kylin 系统、展示镜像源,并完成安装流程的前半段。
但还有一个关键问题——组件的系统支持声明。
# 二、问题由来:组件如何知道支持哪些系统?
Ambari 的安装逻辑中,每个组件(如 HDFS、YARN、HBase)都会定义它支持的系统范围。
而这个支持范围不是硬编码在代码里的,而是通过 XSD 架构文件 与 metainfo.xml 动态绑定的。

上图中我们可以看到,在 RedHat 系列的列表中新增了 kylin10。
然而,如果没有在 XSD 文件中注册该系统,Ambari 在解析时仍会报错。
# 三、修改位置与作用
目标文件:
ambari-server/src/main/resources/version_definition.xsd
该文件用于约束 Ambari 的 版本定义文件(version_definition.xml) 结构,
同时控制哪些 <os> 与 <repo> 标签被视为合法。
换句话说,只有在此处被定义的系统家族,才能在 Stack 的组件配置中被识别。
# 四、修改示例 family-type 枚举扩展
目标
在 version_definition.xsd 的 family-type 枚举中新增 kylin10,让 Ambari 在解析 Stack/Component 的 OS 支持范围时,将
Kylin 10 识别为合法系统家族。
<xs:simpleType name="family-type">
<xs:restriction base="xs:string">
<xs:enumeration value="redhat5"/><!--for test-->
<xs:enumeration value="centos5"/><!--for test-->
<xs:enumeration value="centos6"/><!--for test-->
<xs:enumeration value="redhat6"/><!--for test-->
<xs:enumeration value="redhat7"/>
<xs:enumeration value="redhat8"/>
<xs:enumeration value="redhat9"/>
<xs:enumeration value="fedora36"/>
<xs:enumeration value="fedora38"/>
<xs:enumeration value="redhat-ppc6"/>
<xs:enumeration value="redhat-ppc7"/>
<xs:enumeration value="debian10"/>
<xs:enumeration value="debian11"/>
<xs:enumeration value="ubuntu20"/>
<xs:enumeration value="ubuntu22"/>
<xs:enumeration value="suse11"/>
<xs:enumeration value="suse12"/>
<xs:enumeration value="amazonlinux2"/>
<xs:enumeration value="openeuler22"/>
<!-- 此处尚未声明 kylin10 -->
</xs:restriction>
</xs:simpleType>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<xs:simpleType name="family-type">
<xs:restriction base="xs:string">
<xs:enumeration value="redhat5"/><!--for test-->
<xs:enumeration value="centos5"/><!--for test-->
<xs:enumeration value="centos6"/><!--for test-->
<xs:enumeration value="redhat6"/><!--for test-->
<xs:enumeration value="redhat7"/>
<xs:enumeration value="redhat8"/>
<xs:enumeration value="redhat9"/>
<xs:enumeration value="fedora36"/>
<xs:enumeration value="fedora38"/>
<xs:enumeration value="redhat-ppc6"/>
<xs:enumeration value="redhat-ppc7"/>
<xs:enumeration value="debian10"/>
<xs:enumeration value="debian11"/>
<xs:enumeration value="ubuntu20"/>
<xs:enumeration value="ubuntu22"/>
<xs:enumeration value="suse11"/>
<xs:enumeration value="suse12"/>
<xs:enumeration value="amazonlinux2"/>
<xs:enumeration value="openeuler22"/>
<!-- ✅ 新增声明:使 Kylin 10 成为合法的 family 值 -->
<xs:enumeration value="kylin10"/>
</xs:restriction>
</xs:simpleType>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@@
<xs:enumeration value="amazonlinux2"/>
<xs:enumeration value="openeuler22"/>
+ <!-- add kylin family -->
+ <xs:enumeration value="kylin10"/>
</xs:restriction>
</xs:simpleType>
2
3
4
5
6
7
// Make sure to add code blocks to your code group
为什么必须加在 XSD?
Ambari 在启动时会用 version_definition.xsd 校验并解析各个 Stack 的 metainfo.xml 与版本定义文件。如果 family-type
中没注册 kylin10,即使前面已经完成 OSCheck、os_family.json、repoinfo.xml 的适配,组件层仍会把 kylin10 视作
非法值而拒绝装配,导致页面或日志报错。
# 五、修改原理解析

每当 Ambari Server 启动时,会进行以下动作:
加载 XSD 架构 解析 version_definition.xsd,生成内部的类型约束模型。
解析所有 Stack 目录 包括
stacks/BIGTOP/3.2.0/metainfo.xml等文件。合并组件信息 生成统一的 Stack Metadata JSON,其中每个组件会带上:
"osSpecifics": ["redhat7", "redhat8", "kylin10"]1比对版本定义 只有 XSD 中注册的枚举值,才会被视为合法系统;未注册的将被忽略或报错。
# 六、可视化理解:从 family 到 metainfo 的映射链

结构链条:
OSCheck → os_family.json → repoinfo.xml → version_definition.xsd → metainfo.xml
每个环节的作用如下:
| 环节 | 作用说明 | 关键文件 |
|---|---|---|
| OSCheck | 系统类型识别(kylin) | os_check.py |
| os_family.json | 家族继承定义(kylin → redhat) | os_family.json |
| repoinfo.xml | 前端镜像源定义(kylin10) | repoinfo.xml |
| version_definition.xsd | 系统合法性注册 | version_definition.xsd |
| metainfo.xml | 组件声明支持系统范围 | stacks/*/metainfo.xml |
- 01
- Ambari开启Kerberos认证加密类型错误 Kylin V1011-05
- 02
- KERBEROS SERVICE CHECK 报错11-04