Используйте ambari rest-api с помощью powershell

Поскольку наш мониторинг осуществляется с платформы Windows, мы хотели бы использовать PowerShell для получения информации из ambari-rest-api.

В браузере можно изучить api. Сначала войдите, затем можно вставить используемый URL: https://someazurenode.westeurope.cloudapp.azure.com/ambari/api/v1/clusters Он просто показывает ответ json в браузере.

В завитке:

curl --user myusr:mypwd --insecure -i -H 'X-Requested-By:ambari' -X GET https://someazurenode.westeurope.cloudapp.azure.com/ambari/api/v1/clusters

Работает отлично

В PowerShell (после отключения ssl-проверки **):

$cred = New-Object System.Management.Automation.PSCredential ("myusr", (ConvertTo-SecureString "mypwd" -AsPlainText -Force))
Invoke-WebRequest -Method Get `
  -UseBasicParsing `
  -Uri "https://someazurenode.westeurope.cloudapp.azure.com/api/v1/clusters" -Headers @{"X-Requested-By"="Ambari"} `
  -Credential $cred

--> 404

Вроде что-то с авторизацией, поэтому попробовал вариант ниже (**):

Invoke-WebRequest -Method GET `
  -Uri "https://someazurenode.westeurope.cloudapp.azure.com/api/v1/clusters" `
  -Headers @{Authorization =[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('myusr:mypwd'))}

-> 404 Не найдено

** Вдохновение для игнорирования ssl-проверки: Игнорирование себя- Подписанные сертификаты от Powershell Invoke-RestMethod не работают (снова изменились ...)

** Идея для обработки базовой аутентификации Используйте Invoke-WebRequest с именем пользователя и паролем для базовой аутентификации в GitHub API


person gjh71    schedule 13.09.2018    source источник
comment
Я должен использовать другой URL-адрес в Powershell, а затем в curl / browser?!? Я хотел бы иметь возможность делать в PowerShell то же самое, что и в curl / browser.   -  person gjh71    schedule 14.09.2018
comment
Ммм ... нет, вы используете другой URL-адрес в операторах PowerShell. Вы должны использовать тот же URL.   -  person Ansgar Wiechers    schedule 14.09.2018
comment
Виноват. Это произошло в действии copy-past-anonimize ... :-(   -  person gjh71    schedule 19.09.2018


Ответы (1)


Наконец-то мы нашли проблему ... В нашем случае нам нужно было исправить соединение за 3 шага:

  1. Игнорируйте certicate-error (извините, мы еще не реализовали аккуратный сертификат)
  2. Используйте базовую аутентификацию вместо `` обычных '' учетных данных PowerShell
  3. Принудительно установить версию TLS.

Оттуда легко получить информацию.

function Disable-SslVerification
{
    if (-not ([System.Management.Automation.PSTypeName]"TrustEverything").Type)
    {
        Add-Type -TypeDefinition  @"
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
public static class TrustEverything
{
    private static bool ValidationCallback(object sender, X509Certificate certificate, X509Chain chain,
        SslPolicyErrors sslPolicyErrors) { return true; }
    public static void SetCallback() { System.Net.ServicePointManager.ServerCertificateValidationCallback = ValidationCallback; }
    public static void UnsetCallback() { System.Net.ServicePointManager.ServerCertificateValidationCallback = null; }
}
"@
    }
    [TrustEverything]::SetCallback()
}
function Enable-SslVerification
{
    if (([System.Management.Automation.PSTypeName]"TrustEverything").Type)
    {
        [TrustEverything]::UnsetCallback()
    }
}

$domain = "my-cluster.westeurope.cloudapp.azure.com/ambari"
$usernm = "myusr"
$userpwd = "mypwd"

Disable-SslVerification
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$uri = "https://{0}/api/v1/clusters" -f $domain
Write-Output $uri

$credstring = "{0}:{1}" -f $usernm, $userpwd
$credbytes = [System.Text.Encoding]::ASCII.GetBytes($credstring)
$credbase64 = [System.Convert]::ToBase64String($credbytes)
$credAuthValue = "Basic {0}" -f $credbase64
$headers = @{ Authorization = $credAuthValue}

$result = "-"
$result = Invoke-RestMethod -Method Get -UseBasicParsing -Uri $uri -Headers $headers
$result
person gjh71    schedule 19.09.2018