如何以编程方式更改 Ambari 管理员密码

How to programmatically change Ambari admin password

我正在致力于自动安装和配置集群,包括安装 Ambari 和通过 API 使用蓝图。这一切都很好,但我还有一件事遇到了麻烦,那就是在整个配置过程中更改 Ambari 密码(我在这里指的是我的过程,而不是 Ambari 集群创建过程)。我不想要的是让新配置的 Ambari 安装与默认 "admin/admin" 凭据一起闲置,而且我也不能让人每次都去改变它。

我已经尝试过 REST API,但即使调用似乎正确执行(例如,没有返回任何错误),新密码也永远不会生效。

我考虑过通过 ssh 使用 ambari-admin-password-reset 命令,但我的 Ambari 安装(使用 2.1.0)似乎没有该命令。我仔细检查了代理是 运行,并且我以 root 用户身份尝试过它,在每种情况下,它都会产生 "command not found" 错误。

我也考虑过使用 JDBC,直接连接到 Postgres,并直接修改密码,但我不确定 Ambari 使用哪种哈希算法,and/or 它存储盐的位置(如果使用一个)。

如果有人可以就如何使任何或所有这些方法起作用提供任何建议,我们将不胜感激。现在我要把我最后一根头发扯下来与之抗争。

编辑:FWIW,这就是我调用 REST API 所做的事情,它似乎无声地失败了。

public static void main( String[] args )
{


    // make REST call to Ambari to change password
    try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) 
    {
        HttpHost target = new HttpHost("admin.test-cluster-6.example.com", 8080, "http");

        String authorizationEncoded = Base64.encodeBase64String( "admin:admin".getBytes() );

        // specify the put request
        HttpPut putRequest = new HttpPut( "/api/v1/users/admin" );

        StringEntity jsonEntity = new StringEntity( "{\"Users/password\":\"newpassword\"}" );

        putRequest.setEntity( jsonEntity );
        putRequest.setHeader( "X-Requested-By:", "ambari");
        putRequest.setHeader("Authorization", "Basic " + authorizationEncoded);

        System.out.println("executing request to " + target);

        HttpResponse httpResponse = httpClient.execute(target, putRequest);
        HttpEntity entity = httpResponse.getEntity();
        System.out.println( "status: " + httpResponse.getStatusLine());
        InputStream is = entity.getContent();
        String responseBody = streamToString( is );

        System.out.println( "response: " +  responseBody );

    } 
    catch (IOException e) 
    {
        e.printStackTrace();

    }

    System.out.println( "done" );
}

这样做会产生输出

status: HTTP/1.1 200 OK

这让人相信手术成功了。但是没有骰子。

此外,这是 Ambari 2.1.0,无论您尝试更改哪个用户的密码,都会发生相同的行为。

您的 URL 正确,但您发送的 json 不正确。它应该是这样的形式:

{
  "Users": {
    "user_name": "myusername",
    "old_password": "myoldpassword",
    "password": "mynewpassword"
  }

}

在 ambari wiki 中对此 page 进行了详细说明。