如何以编程方式更改 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 进行了详细说明。
我正在致力于自动安装和配置集群,包括安装 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 进行了详细说明。