Ce script développé dans le cadre d’un projet, permet de monitorer une liste de serveurs web IIS sous Windows. Il pourrait adresser une ferme de serveurs web, sharepoint ou une infra Exchange.
Il tourne en boucle (rafraichissement des données toutes les 10 sec par defaut) et effectue les tests suivants sur une liste de serveurs figurant dans un fichier servers.txt.
- Ping
- Etat du port http
- Nombre de connexions IIS actives
- Utilisation Cpu
Ce script doit être considéré comme une base de travail, charge à vous de l’enrichir et d’y ajouter les éléments manquants.
Quelques rappels de base :
Ping :
1 |
$ping = (Test-Connection $host -Quiet -Count 1 -ErrorAction SilentlyContinue) |
La variable $ping renverra $True si l’ordinateur $host est joignable et $False le cas échéant.
Cpu :
1 |
$cpu = "{0:N0}" -f (Get-Counter -ComputerName $server -Counter "\Processor(_Total)\% Processor Time").CounterSamples[0].CookedValue |
Cette ligne de code récupère la valeur du Compteur de performance “\Processor(_Total)\% Processor Time” qui renseigne sur le taux d’occupation cpu.
La commande de base exécutée sans froufrou sur mon ordinateur donne :
1 2 3 4 5 6 |
PS C:\> Get-Counter -Counter "\Processor(_Total)\% Processor Time" Timestamp CounterSamples --------- -------------- 22/06/2017 18:25:20 \\desktop-1gefip5\processor(_total)\% processor time : 11,01354168335 |
Connections Actives :
Il s’agit du nombre de connections actives sur le serveur web IIS. On récupère pour cela la valeur du Compteur de performance “\Web Service(_Total)\Current Connections”.
1 |
$Connections = (Get-Counter -ComputerName $server -Counter "\Web Service(_Total)\Current Connections").CounterSamples[0].CookedValue |
Note : le fichier servers.txt doit être présent dans le même répertoire que le script.
Voici le code source complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# Monitoring d'une ferme de serveurs IIS # Version 1.1 - light # # * Ping # * Etat du port HTTP # * Nombre de connections actives # * cpu% # $Servers = (Get-Content .\servers.txt) -notmatch '^#' $ErrorActionPreference = "SilentlyContinue" [int]$Refresh = 10 $exit = $False function CountDown($wait) { $startTime = get-date $endTime = $startTime.addSeconds($wait) $timeSpan = new-timespan $startTime $endTime while ($timeSpan -gt 0) { $timeSpan = new-timespan $(get-date) $endTime write-host "`r Refresh in :" $timeSpan.seconds "sec (CTRL-C To Exit) " -nonewline -f yellow sleep 1 } write-host "" } function CheckPort { param([string]$srv, [string]$port) $Socket = New-Object Net.Sockets.TcpClient $Socket.Connect($srv, $port) if ($Socket.Connected) { $result = $true } else { $result = $false } $Socket.Dispose() $Socket = $null return $result } while ($true) { Clear-Host write-host " " write-host " Web farm Health Check ------------------------------------" -f Yellow write-host " " write-host " Server Ping Http Conn Cpu " -f Yellow foreach ($server in $servers) { #Ping $max = $server.length if ($max -gt 30) { $max = 30 } $Name = $Server.substring(0,$max) $Name = $Name.PadRight(30) write-host " " $Name " " -nonewline $ping = (Test-Connection $server -Quiet -Count 1 -ErrorAction SilentlyContinue) if ($ping -eq $true) { write-host " OK " -nonewline -f white } else { write-host " XX " -nonewline -f Red } write-host " " -nonewline #Http $http = (CheckPort $server "80") if ($http -eq $true) { write-host " OK " -nonewline -f white } else { write-host " XX " -nonewline -f Red } write-host " " -nonewline #Connections $Connections = 0 if ($http -eq $true) { $Connections = (Get-Counter -ComputerName $server -Counter "\Web Service(_Total)\Current Connections").CounterSamples[0].CookedValue } write-host $Connections.ToString().PadLeft(4) -NoNewline write-host " " -nonewline #Cpu $cpu = "00" if ($http -eq $true) { $cpu = "{0:N0}" -f (Get-Counter -ComputerName $server -Counter "\Processor(_Total)\% Processor Time").CounterSamples[0].CookedValue } write-host ($cpu+"%").ToString().PadLeft(3) -NoNewline write-host " " } write-host " ---------------------------------------------------------" -f Yellow write-host " " #sleep 10 Countdown $Refresh } |
Bonjour,
Super script !
Je cherche à pinger un certain nombre de nos équipements techniques au travail et de sortir des résultats en fonctions de ping OK ou XX dans un txt.
Je n’arrive pas à inclure la commande > dans le script..
Pouvez-vous m’aider ?
Bonjour Gaetan
Peux tu me montrer la partie de ton script qui ne fonctionne pas ?
Hamid
Bonjour Hamid,
Je souhaite monitorer des serveurs de l’entreprise et les redémarrer à distance en cas de coupure et avoir une alerte par mail. (NB: Avec les orages de ces derniers temps).
Je viens de tomber sur ton script et souhaiterais savoir si je peux l’utiliser?
J’ai 5 serveurs à monitorer.
Merci pour ta réponse.
Bonjour Gérard,
Ce script est encore à l’état embryonnaire mais vous pouvez parfaitement l’adapter à vos besoins propres. Il est bien entendu libre d’utilisation.
Bonne chance à vous.
Hamid