2017-03-08 87 views
0

NSXマネージャのAPI呼び出しを利用するために、powershellとinvoke-webrequestを使用してNSXのアップグレードを自動化するスクリプトを作成しようとしています。私はスクリプトを実行していますが、スクリプトの一部では、応答の一部のデータを確認して一致させる必要があります。実際にはNSX APIの応答は90%がxml形式になりますが、それはjsonになることもあります。 応答がjson形式で来た場合、私のマッチングはうまくいかず、スクリプトのいくつかの部分はxmlを期待しているので動かず、jsonをxmlに変換できません。PowerShell-V5 Invoke-Webrequest 2つのヘッダー認証ヘッダーを追加して受け入れ受付ヘッダーを追加する

私はpowershell v4からは、受け入れ可能なヘッダを追加することができますが、私はすでに承認のために1つのヘッダを使用しているということを理解しています。

複数のヘッダをpowershellのinvoke-webrequestに追加することは可能ですか?そうであれば、それはどのようになりますか?

以下は、私が配布したNSXの現在のバージョンをチェックするスクリプトの一部です。バージョンを示す応答の値と一致します。

#Variables to be used within the script. 
[CmdletBinding()] 
$NSXUsername = "admin" 
$NSXPassword = "VMware1!" 
$uriP = "https://HQ-NSX-01a.nsx.gss" 


# Start time. 
$startclock = (Get-Date) 
Write-Host -BackgroundColor:Black -ForegroundColor:Green "Hello" 
Write-Host -BackgroundColor:Black -ForegroundColor:Green "This script will help you to automate a full NSX environment deployment" 
Write-Host -BackgroundColor:Black -ForegroundColor:Green "FULL NSX Tier Deployment for Single-VC is starting, This Deployment proccess will take an average of 60 min 
======================================================================================== 
           " 




# Create NSX authorization string and store in $head and used in API Calls 
# $nsxcreds = New-Object System.Management.Automation.PSCredential $NSXUsername,$NSXPassword 
$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword)) 
$head = @{"Authorization"="Basic $auth"} 

# Allow untrusted SSL certs else will error out 
    add-type @" 
     using System.Net; 
     using System.Security.Cryptography.X509Certificates; 
     public class TrustAllCertsPolicy : ICertificatePolicy { 
      public bool CheckValidationResult(
       ServicePoint srvPoint, X509Certificate certificate, 
       WebRequest request, int certificateProblem) { 
       return true; 
      } 
     } 
"@ 
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy 


################ 
#Start of Script 
################ 

########################################### 
# Checking the current deployed NSX Version 
########################################### 

    Write-Host -BackgroundColor:Black -ForegroundColor:Green "  Checking the current deployed version of the NSX 
          " 


    $r = Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers $head -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60 
    $nsxbn = ([xml]$r.Content).globalInfo.versionInfo.buildNumber 

    if ($nsxbn -match "2691049") {$nsxcv = "6.1.4"} 
    elseif ($nsxbn -match "3102213") {$nsxcv = "6.1.5"} 
    elseif ($nsxbn -match "3615148") {$nsxcv = "6.1.6"} 
    elseif ($nsxbn -match "3949567") {$nsxcv = "6.1.7"} 
    elseif ($nsxbn -match "2986609") {$nsxcv = "6.2.0"} 
    elseif ($nsxbn -match "3300239") {$nsxcv = "6.2.1"} 
    elseif ($nsxbn -match "3496286") {$nsxcv = "6.2.1a"} 
    elseif ($nsxbn -match "3604087") {$nsxcv = "6.2.2"} 
    elseif ($nsxbn -match "3638734") {$nsxcv = "6.2.2a"} 
    elseif ($nsxbn -match "3755950") {$nsxcv = "6.2.2b"} 
    elseif ($nsxbn -match "3979471") {$nsxcv = "6.2.3"} 
    elseif ($nsxbn -match "4167369") {$nsxcv = "6.2.3a"} 
    elseif ($nsxbn -match "4287432") {$nsxcv = "6.2.3b"} 
    elseif ($nsxbn -match "4292526") {$nsxcv = "6.2.4"} 
    elseif ($nsxbn -match "4818372") {$nsxcv = "6.2.5"} 
    elseif ($nsxbn -match "4977495") {$nsxcv = "6.2.6"} 
    elseif ($nsxbn -match "5007049") {$nsxcv = "6.3.0"} 
    elseif ($nsxbn -match "5124716") {$nsxcv = "6.3.1"} 
    else { 
    Write-host -BackgroundColor:Black -ForegroundColor:Red "  Unable to retrieve the NSX version, This is either due to the current version is unknown to this script or the NSX Manager is powered off. Please check and try again." 
    exit 
    } 

    Write-Host -BackgroundColor:Black -ForegroundColor:Green "  Current version of NSX deployed and to be upgraded is $nsxcv 
          " 

xml形式の場合の応答は以下のようになり、私はバージョンと一致します。

<?xml version="1.0" encoding="UTF-8"?> 
<globalInfo> 
    <currentLoggedInUser>admin</currentLoggedInUser> 
    <versionInfo> 
     <majorVersion>6</majorVersion> 
     <minorVersion>1</minorVersion> 
     <patchVersion>5</patchVersion> 
     <buildNumber>3102213</buildNumber> <<<--- this is my match 
    </versionInfo> 
</globalInfo> 

応答はXML形式(時間の90%)であるが、それはJSONであれば、私は以下のエラーになりますし、スクリプトが終了します場合は、上記のスクリプトがうまく動作します。

Cannot convert value "{"currentLoggedInUser":"admin","versionInfo":{"majorVersion":"6","minorVersion":"1","patchVersion":"5","buildNumber":"3102213"}}" 
to type "System.Xml.XmlDocument". Error: "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong 
type." 
At C:\Users\Administrator\Desktop\Scripts Folder\NSX-Auto-Upgrade-Single.ps1:68 char:2 
+  $nsxbn = ([xml]$r.Content).globalInfo.versionInfo.buildNumber 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [], RuntimeException 
    + FullyQualifiedErrorId : InvalidCastToXmlDocument 

あなたのご協力が大変ありがとうございます。

ありがとうございます。

答えて

0

私はこれに対する答えを見つけ、ここに掲示しました。

あなたはそれが動作する以下のような多くのヘッダを追加するには、ヘッダ部分を変更した場合:

$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword)) 
$head = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$head = @{} 
$head.Add("Authorization","Basic $auth") 
$head.Add("Accept","application/xml") 

を私は私のスクリプトにこれを追加したときに、それを確認するためにも罰金と働いていた私は受け入れるで一度それをやっています"application/xml"と他の "application/json"を受け取り、出力を出力します。

したがって、最初の "アプリケーション/ XML"

スクリプト受け入れる:受け入れるされ

<?xml version="1.0" encoding="UTF-8"?> 
<globalInfo><currentLoggedInUser>admin</currentLoggedInUser><versionInfo><majorVersion>6</majorVersion><minorVersion>1</minorVersion><patchVersion>5</patchVersion>< 
buildNumber>3102213</buildNumber></versionInfo></globalInfo> 

iは、以下にヘッダー変数を変更した場合(:私は以下得る

#Variables to be used within the script. 
[CmdletBinding()] 
$NSXUsername = "admin" 
$NSXPassword = "VMware1!" 
$uriP = "https://HQ-NSX-01a.nsx.gss" 

# Start time. 
$startclock = (Get-Date) 
# Create NSX authorization string and store in $head and used in API Calls 
# $nsxcreds = New-Object System.Management.Automation.PSCredential $NSXUsername,$NSXPassword 
$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword)) 
$head = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$head = @{} 
$head.Add("Authorization","Basic $auth") 
$head.Add("Accept","application/xml") 
# Allow untrusted SSL certs else will error out 
    add-type @" 
     using System.Net; 
     using System.Security.Cryptography.X509Certificates; 
     public class TrustAllCertsPolicy : ICertificatePolicy { 
      public bool CheckValidationResult(
       ServicePoint srvPoint, X509Certificate certificate, 
       WebRequest request, int certificateProblem) { 
       return true; 
      } 
     } 
"@ 
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy 

$r = Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers $head -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60 


    Write-host -BackgroundColor:Black -ForegroundColor:Red "$r" 

をjsonのみ):

$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword)) 
$head = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$head = @{} 
$head.Add("Authorization","Basic $auth") 
$head.Add("Accept","application/json") 

私は以下の取得:

{"currentLoggedInUser":"admin","versionInfo":{"majorVersion":"6","minorVersion":"1","patchVersion":"5","buildNumber":"3102213"}} 

だから私の問題の解決策は、以下に(上記の質問に投稿された)元のスクリプトのヘッダ変数を変更することであり、これは正常に動作することに基づく:

$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($NSXUsername + ":" + $NSXPassword)) 
$head = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$head = @{} 
$head.Add("Authorization","Basic $auth") 
$head.Add("Accept","application/xml") 
関連する問題