ambari-server版本比较

本文对比分析了Ambari-server从2.6版本升级至2.7版本的主要变更,包括引入Swagger注解@ApiModelProperty、资源提供者构造方法调整、代码规范增强、Spring Security配置优化、API中%2F处理方式变动及keyPropertyIds获取方式的变化。

本文针对ambari-server v2.6和v2.7之间的源码进行比较,有些功能的实现还是有变化的。

该文仅是在工作中将ambari2.6 二次开发的代码迁移到ambari 2.7上产生变化的一个记录。

1. @ApiModelProperty

2.7版本在org/apache/ambari/server/controller/目录下的xxxRequest.java和xxxResponse.java文件内新增了@ApiModelProperty注解。

@ApiModelProperty(name = RackResourceProvider.ID_PROPERTY)

@ApiModelProperty是Swagger的一个注解,而Swagger是一款目前世界最流行的API管理工具。详情介绍:点击

2. xxxResourceProvider.java的构造方法的改变

路径:org/apache/ambari/server/controller/internal/

举例:

ambari 2.6

RackResourceProvider(Set<String> propertyIds,
                             Map<Resource.Type, String> keyPropertyIds,
                             AmbariManagementController managementController) {
        super(propertyIds, keyPropertyIds, managementController);
 setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
 setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
    }

ambari 2.7

RackResourceProvider(@Assisted AmbariManagementController managementController) {
    super(Resource.Type.Rack, propertyIds, keyPropertyIds, managementController);
  setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
  setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
}
3. AbstractControllerResourceProvider.java

路径:org/apache/ambari/server/controller/internal/

举例:

ambari 2.6

case Rack:
        return new RackResourceProvider(propertyIds, keyPropertyIds, managementController);

ambari 2.7

case Rack:
    return new RackResourceProvider(managementController);
4. 代码规范

路径:ambari-server/checkstyle.xml

ambari 2.6

<module name="Checker">
  <module name="TreeWalker">
    <module name="AvoidTransactionalOnPrivateMethodsCheck"/>
  </module>
</module>

ambari 2.7

<module name="Checker">
  <!-- Checkstyle binds to phase "validate" by default.
  Run independently as, cd ambari-server ; mvn checkstyle:checkstyle
  Or can skip as, mvn ... -Dcheckstyle.skip
  -->
  <!-- 每个java文件一个语法树 -->
  <module name="TreeWalker">
	<module name="AvoidTransactionalOnPrivateMethodsCheck"/>
    <module name="UndocumentedRestApiOperationCheck"/> <!-- Swagger -->

    <module name="FallThrough"/>
    <!-- 检查没有使用*表示法的import语句 -->
    <module name="AvoidStarImport"/>
    <!-- 检查是否从非法的包中导入了类 -->
    <module name="IllegalImport">
      <property name="illegalPkgs" value="sun, org.apache.ambari.metrics.sink.relocated, org.apache.hadoop.metrics2.sink.relocated"/>
    </module>
    <!-- 检查类的导入顺序 -->
    <module name="ImportOrder">
      <!-- 类型导入组的列表 -->
      <property name="groups" value="java,javax,org,com,*"/>
      <!-- 是否应对每个组中的类型导入进行排序(它不会影响静态导入的排序。) -->
      <property name="ordered" value="true"/>
      <!-- 类型导入组是否应至少由一个空行或注释分隔, -->
      <property name="separated" value="true"/>
      <!-- 关于类型导入和静态导入之间的相对顺序的策略 -->
      <property name="option" value="top"/>
      <!-- 允许按字母顺序对按顶部分组的静态导入进行排序 -->
      <property name="sortStaticImportsAlphabetically" value="true"/>
    </module>
    <!-- 检查是否导入了多余的包 -->
    <module name="RedundantImport"/>
    <!-- 检查是否导入了没有被用到的包 -->
    <module name="UnusedImports"/>

    <!-- blocks -->
    <!-- 检查是否有嵌套代码块 -->
    <module name="AvoidNestedBlocks">
      <property name="allowInSwitchCase" value="true"/>
    </module>
    <!-- 检查是否有空代码块 -->
    <module name="EmptyBlock">
      <property name="option" value="text"/>
    </module>
  </module>
</module>
5. spring security
5.1 下面是对含license字段的api进行免登陆访问:

ambari 2.6

路径:ambari-server/src/main/resources/webapp/WEB-INF/spring-security.xml

新增代码:

<http pattern="/**/license/**" security="none"/>

ambari 2.7

路径:ambari-server/src/main/java/org/apache/ambari/server/configuration/spring/ApiSecurityConfig.java

web的方法

import org.springframework.security.config.annotation.web.builders.WebSecurity;
@Override
public void configure(WebSecurity web) throws Exception {
    // license-related api free login verification
    web.ignoring().antMatchers("/**/license/**");
}

http的方法

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers("/**/license/**").permitAll()
        .anyRequest().authenticated()
5.2 api中%2F的处理

我在ambari-server后台开发了一个自定义api,例如:http://ip:8080/api/v1/racks//rack1,ambari-server会将/rack1转换为%2Frack1

ambari 2.6

ambari-server api中允许%2F等字段

ambari 2.7

ambari-server拒绝包含%2F的URL请求

解决办法:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
@Import(GuiceBeansConfig.class)
@ComponentScan("org.apache.ambari.server.security")
public class ApiSecurityConfig extends WebSecurityConfigurerAdapter{

    @Bean
    public DefaultHttpFirewall allowUrlEncodedSlashHttpFirewall() {
      DefaultHttpFirewall firewall = new DefaultHttpFirewall();
      firewall.setAllowUrlEncodedSlash(true);
      return firewall;
    }
    
    @Override
    public void configure(WebSecurity web) throws Exception {
      // license-related api free login verification
      web.ignoring().antMatchers("/**/license/**");
      // Resolved a request to reject a URL containing %2F
      web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
    }
}
6. keyPropertyIds的获取

ambari 2.6

路径:ambari-server/src/main/resources/key_properties.json和properties.json

以Resource的Type是Rack为例:

properties.json

"Rack":[
    "rack/rack_id",
    "rack/rack_name",
    "rack/rack_height",
    "rack/rack_type",
    "rack/rack_location",
    "rack/rack_description",
    "_"
],

key_properties.json

"Rack": {
    "RepositoryVersion": "rack/rack_id",
    "Rack": "rack/rack_name",
    "User": "rack/rack_height",
    "Member": "rack/rack_type",
    "Task": "rack/rack_location",
    "Auditlog": "rack/rack_description"
},

ambari 2.7

private static Set<String> propertyIds = Sets.newHashSet(
            RACK_ID_PROPERTY_ID,
            RACK_NAME_PROPERTY_ID,
            RACK_HEIGHT_PROPERTY_ID,
            RACK_TYPE_PROPERTY_ID,
            RACK_LOCATION_PROPERTY_ID,
            RACK_DESCRIPTION_PROPERTY_ID
    );

private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
    .put(Resource.Type.Rack, RACK_NAME_PROPERTY_ID)
    .put(Resource.Type.RepositoryVersion, RACK_ID_PROPERTY_ID)
    .put(Resource.Type.User, RACK_HEIGHT_PROPERTY_ID)
    .put(Resource.Type.Member, RACK_TYPE_PROPERTY_ID)
    .put(Resource.Type.Task, RACK_LOCATION_PROPERTY_ID)
    .put(Resource.Type.Auditlog, RACK_DESCRIPTION_PROPERTY_ID)
    .build();

总结:去除了properties.jsonkey_properties.json文件,使用java代码来代替json文件的读取。

更新持续中,敬请关注…


更多精彩干货内容,请关注微信公众号

<think>好的,我现在需要帮助用户安装ambari-server的RPM包。首先,我得回想一下安装RPM包的一般步骤,但ambari-server可能有一些特定的依赖或配置步骤。 首先,用户已经有一个RPM包,可能需要确认这个包是否适用于当前的操作系统,比如CentOS或RHEL的版本是否匹配。如果用户没有提到,可能需要提醒他们检查,但根据问题描述,用户可能已经准备好了正确的包。 接下来,常规的RPM安装命令是使用rpm -ivh命令,但有时候依赖问题会导致安装失败。这时候可能需要先安装依赖项,或者使用yum localinstall来自动解决依赖,这可能更省事。不过用户可能有自己的偏好,所以应该两种方法都提到。 然后,安装完ambari-server之后,通常需要进行一些配置,比如运行ambari-server setup命令,这会引导用户完成数据库配置、JDK路径设置等。这部分很重要,否则服务可能无法启动。 此外,可能需要提醒用户确保Java环境已经安装,因为Ambari依赖于Java。如果用户没有安装Java,安装过程中可能会报错,所以需要提前安装合适的JDK版本。 防火墙和SELinux设置也是常见的问题点,特别是在较新的Linux发行版中。可能需要临时关闭它们或配置正确的规则,以避免安装后服务无法访问。 最后,启动服务并检查状态,确认安装是否成功。如果出现问题,查看日志文件(比如/var/log/ambari-server/)可以帮助诊断问题。 总结步骤应该是:安装依赖、安装RPM包、运行配置、启动服务。同时,注意事项包括Java安装、防火墙设置和日志检查。需要以清晰的结构分步骤说明,确保用户能逐步跟随操作。</think>以下是安装Ambari Server RPM包的详细步骤: 1. **准备环境** - 确认操作系统版本:$$ \text{cat /etc/redhat-release} $$ - 安装必要依赖: ```bash sudo yum install -y openssl-devel postgresql-jdbc mysql-connector-java ``` 2. **安装RPM包** *方法一(推荐使用yum自动解决依赖)* ```bash sudo yum localinstall -y ambari-server-<版本号>.rpm ``` *方法二(使用rpm命令)* ```bash sudo rpm -ivh ambari-server-<版本号>.rpm ``` 3. **初始化配置** ```bash sudo ambari-server setup ``` 配置过程会交互式询问以下内容: - 自定义JDK路径(默认使用内置JDK) - 数据库选择(PostgreSQL/MySQL等) - 数据库驱动配置 - LDAP集成(可选) 4. **启动服务** ```bash sudo ambari-server start ``` 5. **验证安装** ```bash sudo ambari-server status ``` **注意事项**: 1. 需提前安装Java环境(推荐JDK 8/11) $$ \text{java -version} $$ 2. 开放防火墙端口(默认8080) ```bash sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload ``` 3. 若遇到依赖错误,可通过以下命令查找缺失依赖: ```bash rpm -qpR ambari-server-<版本号>.rpm ``` 4. 日志文件路径: $$ \text{/var/log/ambari-server/ambari-server.log} $$ **典型问题处理**: - 出现`Database not found`错误时: ```bash sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar ``` - 重置配置: ```bash sudo ambari-server reset ``` 完成安装后,可通过浏览器访问: $$ \text{http://<服务器IP>:8080} $$ 使用默认账号`admin/admin`登录进行集群管理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值