2016-11-30 2 views
0

Я работаю над автоматизацией установки и подготовки кластеров, которая включает в себя установку Ambari и использование Blueprint через API. Это все работает нормально, но у меня есть еще одна вещь, с которой у меня возникают проблемы, и это изменение пароля Ambari во время общего процесса подготовки (я имею в виду мой процесс здесь, а не процесс создания кластера Ambari). То, что я НЕ хочу, заключается в том, чтобы оставить только что подготовленные установки Ambari, сидящие с учетными данными администратора «admin/admin» по умолчанию, и я также не могу заставить человека менять это каждый раз.Как программно изменить пароль администратора Ambari

Я пробовал API REST, но даже если вызов работает правильно (например, никаких ошибок не возвращается), новый пароль никогда не вступает в силу.

Я думал об использовании команды ambari-admin-password-reset через ssh, но моя установка Ambari (с использованием 2.1.0), похоже, не имеет этой команды. Я дважды проверял, что агент запущен, и я пробовал его как пользователя root, и в каждом случае он дает ошибку «команда не найдена».

Я также думал об использовании JDBC, напрямую подключающемся к Postgres, и вручную переписывая пароль, но я не уверен, какой хэш-алгоритм использует Ambari и/или где он хранит соль (если она используется).

Если кто-либо может дать какие-либо рекомендации о том, как сделать любой или все эти подходы работать, было бы весьма полезно. Прямо сейчас я собираюсь сорвать мои последние волосы, сражаясь с этим.

Редактировать: FWIW, вот что я делаю с моим вызовом API REST, который, кажется, терпит неудачу.

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" 
    } 

}

Это подробно об этом page в ambari вики.

Смежные вопросы