Я работаю над проектом здесь, и я немного застрял в одном.
Проект представляет собой автоматизацию процесса оценки для среды клиента.
Идея состоит в том, чтобы запустить сценарий в среде клиента, который будет извлекать ряд информации из среды клиента, а затем вывести ее в файл XML, а затем, используя другой сценарий, прочитать файл XML с дампом и преобразовать данные в нем. в PowerShell Object для выполнения анализа этих данных.
Полученные данные должны быть организованы таким образом, чтобы я получал всю информацию и данные и добавлял их в PSCustomeObject / HashTable, а затем преобразовывал их в xml и сохранял по необходимому пути.
Для организации данных, которые я извлек в PSCustomObject / HashTable, у меня фактически есть вложенный PSCustomObject / HashTable, что делает его более сложным.
Данные, которые будут получены, имеют другой тип, некоторые из них на самом деле являются CSV-файлами, некоторые из них являются строками, а другие являются системными объектами.
Ниже приведен пример того, что я делаю с кодом.
#Get NSX Controller Config From Managing NSX Manager.
$ControllerConfig = $ContConfig
#Get NSx Controller VM vSphere Info.
$ControllerVmInfo = Get-VM -Server $vCenterServerHostingWorkingNsxControllers | Where-Object {$_.ExtensionData.moref.value -Eq $ContConfig.virtualMachineInfo.objectId}
$ControllerESXi = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-VMHost
$ControllerCluster = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Cluster
$ControllerDataStore = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Datastore
$ControllerSnapShot = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Snapshot
$ControllerClusterResources = Get-ClusterInfo -ReqVIServer $vCenterServerHostingWorkingNsxControllers -ReqCluster $ControllerCluster.Name
$ControllerVMCpuUsagePercent = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat cpu.usage.average | Sort-Object Timestamp -Descending | Select-Object -First 1).Value
$ControllerVMMemUsagePercent = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat mem.usage.average | Sort-Object Timestamp -Descending | Select-Object -First 1).Value
$ControllerVMUsedDiskSpace = [math]::Round(((Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name).UsedSpaceGB | Measure-Object -Sum).sum)
$ControllerCpuHistoricUsage = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat cpu.usage.average)
$ControllerMemoryHistoricUsage = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat mem.usage.average)
$ControllerVMDiskReadLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat virtualdisk.totalreadlatency.average)
$ControllerVMDiskWritLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat virtualdisk.totalwritelatency.average)
$ControllerVMMaxTotalLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat disk.maxTotalLatency.latest)
#Get NSX Controller SSH Output.
$ControllerSSHPassword = ConvertTo-SecureString $EnvironmentInfo.NsxControllersPassword -AsPlainText -Force
$ControllerCredentials = New-Object System.Management.Automation.PSCredential ("admin", $ControllerSSHPassword)
$ControllerSSHSession = New-SSHSession -ComputerName $ContConfig.ipAddress -Credential $ControllerCredentials -AcceptKey
$ControllerClusterStatus = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show control-cluster status").Output
$ControllerClusterStartupNodes = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show control-cluster startup-nodes").Output
$ControllerDiskStatus = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show status").Output | Where-Object {$_ -Match "\S+\s+\d+\s+\d+\s+\d+\s+(\d+)%\s(\/\S*)$"}
$ControllerUpTime = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show status").Output | Where-Object {$_ -Match "Uptime"}
Remove-SSHSession -SSHSession $ControllerSSHSession | Out-Null
#Add all retrived data in a Hash Table
$NsxControllerDataRetrival = New-Object PSObject -Property @{
ControllerId = $ControllerConfig.id
ControllerConfig = $ControllerConfig
ControllervSphereInfo = New-Object PSObject -Property @{
ControllerVmInfo = $ControllerVmInfo
ControllerESXi = $ControllerESXi
ControllerCluster = $ControllerCluster
ControllerDataStore = $ControllerDataStore
ControllerSnapShot = $ControllerSnapShot
ControllerClusterResources = $ControllerClusterResources
ControllerVMCpuUsagePercent = $ControllerVMCpuUsagePercent
ControllerVMMemUsagePercent = $ControllerVMMemUsagePercent
ControllerVMUsedDiskSpace = $ControllerVMUsedDiskSpace
ControllerCpuHistoricUsage = $ControllerCpuHistoricUsage
ControllerMemoryHistoricUsage = $ControllerMemoryHistoricUsage
ControllerVMDiskReadLatency = $ControllerVMDiskReadLatency
ControllerVMDiskWritLatency = $ControllerVMDiskWritLatency
ControllerVMMaxTotalLatency = $ControllerVMMaxTotalLatency
}
ControllerSshInfo = New-Object PSObject -Property @{
ControllerClusterStatus = $ControllerClusterStatus
ControllerClusterStartupNodes = $ControllerClusterStartupNodes
ControllerDiskStatus = $ControllerDiskStatus
ControllerUpTime = $ControllerUpTime
}
}
($NsxControllerDataRetrival | ConvertTo-Xml).Save($ResultFilePath + "NSX-Controller-Data-" + $EnvironmentInfo.NsxManagerFqdn + ".xml")
На самом деле, если я использую PSObject и преобразую его в XML, он выдаст ошибку с приведенной ниже ошибкой, поскольку мне нужно будет добавить глубину, но трудно определить требуемую глубину, учитывая, что вышеупомянутое повторяется многократно через процесс с различными данными, которые будут получены в разное время.
ConvertTo-Xml : Unexpected end of file has occurred. The following elements are not closed: Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Object,
Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Object, Property, Property, Property, Property, Property, Property, Property, Property,
Property, Property, Property, Property, Property, Property, Property, Object, Objects. Line 6, position 10817.
At \\tsclient\RDP-Shared-Folder\New-Multi-Site-Tool\Sub-Scripts\CGS-AT-Gather-NSX.ps1:1065 char:29
+ ($NsxControllerDataRetrival | ConvertTo-Xml).Save($Re ...
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [ConvertTo-Xml], XmlException
+ FullyQualifiedErrorId : System.Xml.XmlException,Microsoft.PowerShell.Commands.ConvertToXmlCommand
Если использовать HashTable, чтобы добавить все данные и затем вывести их в файл XML, формат файла XML будет очень сложным, и я не смог выяснить точечную запись или запрос XPath для извлечения атрибутов / элементов при чтении XML-файл в более поздней точке. Пример файла XML выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<Objects>
<Object Type="System.Collections.Hashtable">
<Property Name="Key" Type="System.String">ControllerSshInfo</Property>
<Property Name="Value" Type="System.Collections.Hashtable">
<Property Name="Key" Type="System.String">ControllerClusterStatus</Property>
<Property Name="Key" Type="System.String">ControllerUpTime</Property>
<Property Name="Value" Type="System.String">Uptime: 106 days 16 hours 43 minutes 54 seconds </Property>
<Property Name="Key" Type="System.String">ControllerClusterStartupNodes</Property>
<Property Name="Value" Type="System.String[]">
<Property Type="System.String">192.168.4.61, 192.168.4.62, 192.168.4.63</Property>
</Property>
<Property Name="Key" Type="System.String">ControllerDiskStatus</Property>
<Property Name="Value" Type="System.Object[]">
<Property Type="System.String">devtmpfs 2009560 0 2009560 0% /dev</Property>
<Property Type="System.String">/dev/sda2 3997376 2266940 1504340 61% /</Property>
<Property Type="System.String">/dev/sda1 999320 40952 889556 5% /boot</Property>
<Property Type="System.String">/dev/sda6 1998672 3092 1874340 1% /config</Property>
<Property Type="System.String">/dev/sda3 3997376 8184 3763096 1% /os_bak</Property>
<Property Type="System.String">/dev/sda5 5029504 1795892 2955084 38% /var/log</Property>
<Property Type="System.String">/dev/sda7 5029504 10236 4740740 1% /image</Property>
<Property Type="System.String">/dev/sda4 3997376 142004 3629276 4% /var/cloudnet/data</Property>
</Property>
</Property>
Буду признателен за помощь, если вы поможете мне с выгрузкой данных в XML-файл с более простым форматированием или даже укажете мне другой путь, по которому я могу сделать выше.
Спасибо за вашу помощь.