Статус обслуживания Powershell ||HTML-вывод - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть код ниже, который будет проверять состояние общих служб для всех серверов, а некоторые службы будут проверяться в соответствии со списком серверов.Если это сервер приложений, он будет проверять определенный список серверов, и если это сервер БД, он будет проверять определенный список служб.

Ниже код работает нормально, и я получаю вывод в консоли.Я только сталкиваюсь с проблемой, чтобы получить это в HTML-таблицу, и я хочу получить результат, как показано ниже:

Common Service Check
ServerA service1 running 
ServerA service2 running 
Serverx service1 running 
Servery service2 running 


Application Status

ServerA service3 running 
ServerA service4 running 

DB Server Status
Serverx service5 running 
Servery service6 running 

Ниже приведен код:

$server = Import-Csv "\path\server.txt"
foreach($ServerName in $server)
{
    $IDE = $($ServerName.types)  
    $hostname = $($ServerName.sname) 

    $CService = @('service1*'
        'service2')

    foreach($commonser in $CService)
    {
        $servicecomm = Get-Service "$commonser" -ComputerName $hostname
        write-host $servicecomm.MachineName $servicecomm.name $servicecomm.Status 
    }
    #write-host $IDE
    #write-host $hostname

    If ($IDE -eq "APP")
    {

    $APPList = @(
        'Service3'
        'Service4*'
    )

    foreach($appslist in $APPList)
    {
        $serviceapp = Get-Service "$appslist" -ComputerName $hostname
        Write-Host  $serviceapp.MachineName $serviceapp.name $serviceapp.Status 
    }
}
elseif($IDE -eq "DB")
{
    $DBList = @(
        'service5'
        'service6'
    )
    foreach($dblist in $DBList)
    {
        $servicedb = Get-Service "$dblist" -ComputerName $hostname
        Write-Host  $servicedb.MachineName $servicedb.name $servicedb.Status 
    }
}

Ниже текстового файла списка серверов

types,sname
APP,ServerA
APP,ServerB
DB,ServerX
DB,ServerY

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Для начала вам нужно будет собирать результаты, а не просто выводить их на экран, так как они возвращаются, как и вы сейчас.Я вернусь к этому через секунду, хотя.Сначала давайте кратко рассмотрим Get-Service.Если вы запустите Get-Help Get-Service, вы увидите набор параметров с синтаксисом:

Get-Service [[-Name] <String[]>] [-ComputerName <String[]>] [-DependentServices] [-Exclude <String[]>] [-Include <String[]>] [-RequiredServices] [<CommonParameters>]

Теперь, что мне говорит о том, что параметр -Name принимает массив строк (как указано <String[]>, поскольку, если он принимает только одну строку, он будет указан как <String>).Он также принимает массив строк для параметра -ComputerName.Это означает, что мы можем запустить команду один раз для каждой категории, то есть всего 3 раза, что должно ускорить процесс.В прошлом мы могли выводить результаты в фрагменты HTML, а затем объединять эти фрагменты в одну страницу HTML, которую мы можем выводить в файл и открывать в веб-браузере.

Итак, сначала мы получаем данные с серверов:

$server = Import-Csv "\path\server.txt"

$CService = @('service1*','service2')
$APPList = @('Service3','Service4*')
$DBList = @('service5','service6')

$CServiceResults = Get-Service $CService -ComputerName $server.sname
$APPListResults = Get-Service $APPList -ComputerName $server.sname
$DBListResults = Get-Service $DBList -ComputerName $server.sname

Теперь, когда у нас есть данные, мы можем создать фрагменты HTML для каждой таблицы, включая заголовок для каждой.Мы должны преобразовать выходные данные в строку, чтобы потом можно было объединить их все:

$CServiceFrag = $CServiceResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>Common Services</H2>" -Fragment | Out-String
$APPListFrag = $APPListResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>App Services</H2>" -Fragment | Out-String
$DBListFrag = $DBListResults | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>DB Services</H2>" -Fragment | Out-String

Мы должны добавить небольшое форматирование, чтобы таблицы выглядели хорошо, чтобы отчет не был полной глазурью.

$Header = @"
<style>
H1, H2 {
    font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
}

table {
    font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

table, td, th {
    border: 1px solid #ddd;
    padding: 8px;
}

table tr:nth-child(even){background-color: #f2f2f2;}

table tr:hover {background-color: #ddd;}

table th {
    padding-top: 12px;
    padding-bottom: 12px;
    text-align: left;
    background-color: #3366FF;
    color: white;
}
</style>
"@

Затем мы складываем все это вместе с ConvertTo-HTML и выводим его в файл.Получив файл, мы просто используем Invoke-Item, чтобы открыть его в браузере по умолчанию.

ConvertTo-Html -Head $Header -Pre "<H1>Service Status Report</H1>" -PostContent $CServiceFrag,$APPListFrag,$DBListFrag|Set-Content C:\Temp\Services.htm
Invoke-Item C:\temp\Services.htm

Пример вывода: Sample Report

Обратите внимание, что мой HTMLнавыки - мусор, так что информация о стиле была почти полностью сорвана с https://www.w3schools.com/css/css_table.asp, с небольшими угадываниями и модификациями, которые я выбрал для удовлетворения потребностей.

Редактировать: Я могу 'Я не могу помочь с настройкой цветов, но я могу помочь с сортировкой, если вы не возражаете против этого, прежде чем выводить на веб-страницу.Для этого вы должны изменить строки, которые создают ваши фрагменты HTML.Например, если вы хотите отсортировать общие службы по имени сервера, вы можете сделать:

$CServiceFrag = $CServiceResults | Sort MachineName | ConvertTo-Html -Property MachineName,ServiceName,Status -As Table -Pre "<H2>Common Services</H2>" -Fragment | Out-String

Если вы хотите отсортировать их по имени службы, вы измените Sort MachineName на Sort ServiceName.

0 голосов
/ 26 сентября 2018

Прежде всего вам нужно будет создать HTML отформатированную страницу, которая будет соответствовать вашим потребностям.Вот краткий пример того, как построить HTML страницу с вашим скриптом.Вот так:

$HTML = '<html>
<body>
<head>
<style>
table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
    text-align: left;    
}
</style>
</head>'
$HTML_CommonServiceCheck = '<table><tr><th>Common Service Check</th></tr>'
$HTML_ApplicationStatus = '<table><tr><th>Application Status</th></tr>'
$HTML_DBServerStatus = '<table><tr><th>DB Server Status</th></tr>'

$server = @(Import-Csv '\path\server.txt')

foreach($ServerName in $server)
{
    $IDE = $($ServerName.types)  
    $hostname = $($ServerName.sname) 

    $CService = @('service1','service2')

    foreach($commonser in $CService)
    {
        $servicecomm = Get-Service $commonser -ComputerName $hostname
        $HTML_CommonServiceCheck += '<tr><td>{0} {1} {2}</td></tr>' -f $servicecomm.MachineName, $servicecomm.name, $servicecomm.Status 
    }

    If ($IDE -eq "APP")
    {

        $APPList = @('service3','service4*')

        foreach($appslist in $APPList)
        {
            $serviceapp = Get-Service $appslist -ComputerName $hostname
            $HTML_ApplicationStatus += '<tr><td>{0} {1} {2}</td></tr>' -f $serviceapp.MachineName, $serviceapp.name, $serviceapp.Status 
        }

    }
    elseif($IDE -eq "DB")
    {
        $DBList = @('service5','service6')

        foreach($dblist in $DBList)
        {
            $servicedb = Get-Service $dblist -ComputerName $hostname
            $HTML_DBServerStatus += '<tr><td>{0} {1} {2}</td></tr>' -f $servicedb.MachineName, $servicedb.name, $servicedb.Status 
        }

    }
}

$HTML_CommonServiceCheck += '</table>'
$HTML_ApplicationStatus += '</table>'
$HTML_DBServerStatus += '</table>'
$HTML += $HTML_CommonServiceCheck
$HTML += $HTML_ApplicationStatus
$HTML += $HTML_DBServerStatus
$HTML += '</body></html>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...