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
あなたのご協力が大変ありがとうございます。
ありがとうございます。