Как программно изменить пароль администратора Ambari
Я работаю над автоматизацией установки и подготовки кластеров, которая включает в себя установку Ambari и использование Blueprint через API. Это все работает нормально, но у меня есть еще одна проблема, с которой у меня возникают проблемы, - это изменение пароля Ambari в ходе всего процесса обеспечения (здесь я имею в виду мой процесс, а не процесс создания кластера Ambari). Чего я не хочу, так это чтобы оставленные недавно установленные установки Ambari бездействовали с учетными данными "admin/admin" по умолчанию, и я также не могу заставить человека каждый раз менять это.
Я попробовал REST API, но даже если кажется, что вызов выполняется правильно (например, ошибки не возвращаются), новый пароль никогда не вступает в силу.
Я думал об использовании команды ambari-admin-password-reset через ssh, но моя установка Ambari (с использованием 2.1.0), похоже, не имеет этой команды. Я дважды проверил, что агент работает, и я пробовал его как пользователь root, и в каждом случае он выдает ошибку "команда не найдена".
Я также думал об использовании JDBC, подключении напрямую к Postgres и манипулировании паролем напрямую, но я не уверен, какой алгоритм хэширования использует Ambari и / или где он хранит соль (если используется).
Если кто-то может дать какой-либо совет о том, как заставить работать какой-либо из этих подходов или все эти подходы, это будет с благодарностью Прямо сейчас я собираюсь вырвать свои последние волосы, борясь с этим.
Изменить: 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, и такое же поведение происходит независимо от того, какой пароль пользователя вы пытаетесь изменить.
1 ответ
У вас есть правильный URL, но отправленный вами json неверен. Это должно быть в форме:
{
"Users": {
"user_name": "myusername",
"old_password": "myoldpassword",
"password": "mynewpassword"
}
}
Это подробно описано на этой странице в ambari wiki.