我正在尝试使用powershell和invoke-webrequest创建一个自动升级NSX的脚本,以利用NSX Manager的API调用。我正在使用脚本,但脚本的某些部分我需要检查并匹配响应中的一些数据。事实上,NSX API响应将90%采用xml格式,但有时可以采用json格式。 如果响应以json格式出现,我的匹配将不起作用,并且脚本的某些部分将无法工作,因为它期望xml并且无法将json转换为xml。
据我了解,从powershell v4开始,您可以添加接受标头,但问题是我已经使用一个标头进行授权。
是否可以在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 :(得分:3)
我认为您打算通过powershell向REST API调用添加多个标头。而不是像这样添加标题,
$head = @{"Authorization"="Basic $auth"}
Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers $head -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60
你可以像这样添加它们
Invoke-WebRequest -Uri "$uriP/api/1.0/appliance-management/global/info" -Method:Get -Headers @{"Authorization"="Basic $auth"; "Accept"="application/xml"} -ContentType "application/xml" -ErrorAction:Stop -TimeoutSec 60
答案 1 :(得分:1)
我找到了答案并将其发布在这里。
如果你更改标题部分以添加更多标题,就像下面一样,它将起作用:
$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")
因此,当我将此添加到我的脚本时,它工作正常并且还确认我已经使用accept&#34; application / xml&#34;另一个接受&#34; application / json&#34;并打印输出。
首先接受&#34; application / xml&#34;
脚本:
#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"
我得到以下内容:
<?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>
如果我将标头变量更改为以下(仅接受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")