juin
2010
Comment monitorer les principaux services SQL de tous les serveurs de base de données du réseau ?
Les différentes étapes :
0.) Configurer votre poste de façon à pouvoir exécuter un script Powershell.
J’ai écrit un petit billet pour ça ICI
1.) Créer un fichier contenant les informations d’accès aux serveurs
Ce fichier contenant la liste des serveurs nommée : listeserveurs.txt a la structure suivante :
AdresseIP,Domaine\Login,Password,NomInstance
AdresseIP = Adresse IP (ou nom) du serveur de base de données
Domaine = Domaine
Login = login
Password = mot de passe
NomInstance = Nom de l’instance de la base de données à monitorer.
Valeur par défaut default pour monitorer l’instance par défaut et NomInstance pour monitorer une instance nommée NomInstance
Exemple de fichier listeserveurs.txt :
IP0,Domaine0\Login0,Password0,default
IP1,Domaine1\Login1,Password1,NomInstance1
IP2,Domaine2\Login2,Password2,NomInstance2
2.) Script de monitoring des principaux services : Moteur SQL et Agent SQL
################ Monitoring ##########################################################################
#Lire le contenu du fichier contenant les infos des serveurs
$listserveurs = get-content "listeserveurs.txt"
#Traiter chaque ligne du fichier
foreach ($ligne in $listserveurs) {
# Découpage de la ligne
$decoupageligne = $ligne.split(",")
# Nom du serveur
$serveur = $decoupageligne[0]
# le login pour ce serveur
$login = $decoupageligne[1]
# le password du serveur
$stringpwd = $decoupageligne[2]
$pwd = convertto-securestring $stringpwd -asplaintext -force;
# Construire la chaine d'authentification
$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $login,$pwd -ErrorAction "silentlycontinue";
# Instance à traiter
$instance = $decoupageligne[3]
# Pingé le serveur courant
$resultatsPing = Get-WMIObject -query "select StatusCode from Win32_PingStatus where Address = '$serveur'"
$reponse = $false
ForEach($resultat in $resultatsPing) {
if ($resultatsPing.statuscode -eq 0) {
$reponse = $true
}
}
if ($reponse) {
# le serveur courant répond au ping
Write-Host -foregroundcolor "green" ****************************************************************************************************
Write-Host -foregroundcolor "green" Ping Serveur $serveur --- OK
Write-Host -foregroundcolor "green" ****************************************************************************************************
######## ETATS DES SERVICES ############
if ($instance -eq 'default'){
Write-Host ------------------------------------------------------
Write-Host SERVEUR -- $serveur INSTANCE -- $instance
Write-Host ------------------------------------------------------
$instancetraitemoteurdefault = 'MSSQLSERVER'
$instancetraiteagentdefault = 'SQLSERVERAGENT'
#Pour le moteur SQL
$statemoteursqldefault = Get-WMIObject -query "select state from win32_service where name = '$instancetraitemoteurdefault'" -computername $serveur -credential $credential
if ($statemoteursqldefault.state -eq 'Running'){
Write-Host -foregroundcolor "green" Serveur $serveur -- Moteur SQL $instancetraitemoteurdefault -- Démarré
Get-WMIObject win32_service -filter "name ='$instancetraitemoteurdefault'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}else
{Write-Host -foregroundcolor "red" Serveur $serveur -- Moteur SQL $instancetraitemoteurdefault -- Arrêté
Get-WMIObject win32_service -filter "name ='$instancetraitemoteurdefault'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}
#Pour l'agent SQL
$stateagentsqldefault = Get-WMIObject -query "select state from win32_service where name = '$instancetraiteagentdefault'" -computername $serveur -credential $credential
if ($stateagentsqldefault.state -eq 'Running'){
Write-Host -foregroundcolor "green" Serveur $serveur -- Agent SQL $instancetraiteagentdefault -- Démarré
Get-WMIObject win32_service -filter "name ='$instancetraiteagentdefault'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}else
{Write-Host -foregroundcolor "red" Serveur $serveur -- Agent SQL $instancetraiteagentdefault -- Arrêté
Get-WMIObject win32_service -filter "name ='$instancetraiteagentdefault'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}
}
else{
#Traitement des instances nommées
Write-Host ------------------------------------------------------
Write-Host SERVEUR -- $serveur INSTANCE -- $instance
Write-Host ------------------------------------------------------
$instancetraitemoteur = 'MSSQL$'+$instance
$instancetraiteagent = 'SQLAgent$'+$instance
#Pour le moteur SQL
$statemoteursql = Get-WMIObject -query "select state from win32_service where name = '$instancetraitemoteur'" -computername $serveur -credential $credential
if ($statemoteursql.state -eq 'Running'){
Write-Host -foregroundcolor "green" Serveur $serveur -- Moteur SQL $instancetraitemoteur -- Démarré
Get-WMIObject win32_service -filter "name ='$instancetraitemoteur'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}else
{Write-Host -foregroundcolor "red" Serveur $serveur -- Moteur SQL $instancetraitemoteur -- Arrêté
Get-WMIObject win32_service -filter "name ='$instancetraitemoteur'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}
#Pourl'agent SQL
$stateagent = Get-WMIObject -query "select state from win32_service where name = '$instancetraiteagent'" -computername $serveur -credential $credential
if ($stateagent.state -eq 'Running'){
Write-Host -foregroundcolor "green" Serveur $serveur -- Agent SQL $instancetraiteagent -- Démarré
Get-WMIObject win32_service -filter "name ='$instancetraiteagent'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}else
{Write-Host -foregroundcolor "red" Serveur $serveur -- Agent SQL $instancetraiteagent -- Arrêté
Get-WMIObject win32_service -filter "name ='$instancetraiteagent'" -computername $serveur -credential $credential | format-table -property displayname,state,StartMode,status
}
}
}
else {
# le serveur courant ne répond au ping
Write-Host -foregroundcolor "red" Le Serveur $serveur ne répond pas /!\ -- KO
Write-Host -foregroundcolor "red" Ping Serveur $serveur -- KO
}
}
3.) Résultat
****************************************************************************************************
Ping Serveur IP0 — OK
****************************************************************************************************
——————————————————
SERVEUR IP0 INSTANCE — default
——————————————————
Serveur IP0 Moteur SQL MSSQLSERVER — Démarrédisplayname state StartMode status
———– —– ——— ——
MSSQLSERVER Running Auto OKServeur IP0 Agent SQL SQLSERVERAGENT — Démarré
displayname state StartMode status
———– —– ——— ——
SQLSERVERAGENT Running Auto OK….
Remarque : il faut trouver un moyen de sécuriser le fichier contenant des logins et password. par exemple le crypté
/*****************************************************************************
— MONITORING DES SERVICES SQL DE TOUTES LES INSTANCES DE BASE DE DONNEES
— Auteur : Etienne ZINZINDOHOUE
*****************************************************************************/