Я работаю над автоматизацией установки и подготовки кластеров, включая установку 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, и такое же поведение происходит независимо от того, пароль какого пользователя вы пытаетесь изменить.