Как программно изменить пароль администратора 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, и такое же поведение происходит независимо от того, пароль какого пользователя вы пытаетесь изменить.


person mindcrime    schedule 30.11.2016    source источник


Ответы (1)


У вас правильный URL-адрес, но отправленный вами json неверен. Он должен иметь вид:

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

}

Это подробно описано на этой странице вики-сайта Ambari.

person cjackson    schedule 07.12.2016