Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

SCOM – Créer une vue avec un filtre « NOT »

 

Tout administrateur SCOM qui se respecte a déjà été amené à créer des vues d’alerte ou d’état spécifiques, ciblées sur une classe et filtrées en fonction d‘un niveau de résolution (resolution state), d’une criticité…

clip_image001

clip_image002

Une problématique revient cependant de temps en temps : comment créer une vue qui exclue spécifiquement certaines alertes en fonction de leur nom ?
Autrement dit, comment afficher toutes les alertes SAUF celles correspondant à un certain nom ?

Le filtre « with a specific name » ne permet à première vue pas de réaliser cette exclusion ; il semble plutôt prévu pour fonctionner en mode « inclusif » : seules les alertes répondant à la chaine de caractères entrée seront affichées :

clip_image004

Mais il est en réalité possible d’utiliser une expression d’exclusion dans ce champ, en plus des wildcards « SQL », à l’aide de la syntaxe suivante :

[^AlerteAExclure]

clip_image006

Voici le résultat obtenu :

clip_image008

Il est également possible de combiner plusieures exclusions à l’aide du symbole « pipe » :

[^(AlerteAExclure)|(TestAlert2)]

Attention toutefois, cette astuce exclut en réalité un groupe de caractères et ne supporte donc pas l’utilisation d’espaces.

Powershell: Gestion des erreurs sur Cmdlet

 

Dans mon précédent blog, je vous est montré comment on pouvait mettre en place la gestion d’erreur sur des commandes sous powershell qui ne sont pas des CMDLET, cette fois-ci nous allons voir comment appliquer la gestion d’erreur sur une CMDLET

PERIMETRE: Dans le cadre de l’amélioration des script powershell concernant la vérification des services après le redémarrage des serveurs en production chez un de nos client, celui-ci à laisser le soin au service architecture de trouver une solution.

 

Mon script d’origine:

######SERVEURS A REDEMARRER################

$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")

######SERVICES A ARRETER ET REDEMARRER################

$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")

######LOG CREER POUR LA VERIFICATION AVANT L’ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###
$StatusService = foreach ($vm in $Computerdestination){
         get-Service -ComputerName $vm -name $Servicesname | select status,name,machinename }
       

#GESTION ERREUR DES SERVICES

$ExitCodeService = foreach ($SRVservices in $StatusService) {
if ($($SRVservices.status) -eq "Running"){
"Success : Service(s) Running" + $SRVservices
}else{
"Error : Service(s)" + $SRVservices
}
}

$ErrorStatusSVC = if ($StatusService -eq $null){
"Error : Service(s) "
}else{
"Success : Service(s)"
}  

Voici le résultat pour les sortie erreurs:

$ExitCodeService

image

$ErrorStatusSVC

image

Vous voyez au dessus $ExitCodeService prend en compte que le service wudfsvc étant arrêté comme SUCCESS condition voulu ceci est normal et que $ErrorStatusSVC à été mise en place pour anticipé les erreurs $ExitCodeService si aucune valeur ne ressort ($ExitCodeService = VIDE) cela peut être une erreur de syntaxe, de service ou de serveurs inaccessible ou inexistant

Par contre aucune erreur détailler il faut effectuer une recherche supplémentaire.

 

Mon script amélioré:

######SERVEURS A REDEMARRER################

$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")

######SERVICES A ARRETER ET REDEMARRER################

$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")

######LOG CREER POUR LA VERIFICATION AVANT L’ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###

$StatusService =
Try {
foreach ($vm in $Computerdestination){
         get-Service -ComputerName $vm -name $Servicesname -ErrorAction stop | select status,name,machinename
        }
}catch{
   "$vm => " + $Error[0]
   }

#GESTION ERREUR DES SERVICES

$ExitCodeService =                                                                                         foreach ($SRVservices in $StatusService) {
            if ($($SRVservices.status) -eq "stopped"){
                    "Success:" + $SRVservices
            }else{
                   "Error:" + $SRVservices
            } 
    }

Voici le résultat pour la sortie d’erreur:

La correction se base sur la gestion d’erreur avec les commandes Try et Catch

Dans la partie Try  entre crochets, la commande get-service doit obligatoirement avoir l’option qui permet la sortie d’erreur qui se nomme        –ErrorAction stop cela permettra d’avoir dans la partie catch les messages d’erreur le déroulement du processus $Error[0] . 

Message des erreurs qui sont géré dans : $StatusService

image

Erreur sur le compte d’ordinateur inexistant ou inaccessible:

image

Erreur sur le service inexistant ou inaccessible:

image

Erreur sur la syntaxe commande get-service:

image

Les messages de sortie sont aussi retransmis dans la variable  $ExitCodeService à l’aide des conditions if et else

Powershell – Exemple de transfert de données vers un système Unix

 

A la suite de la récupération d’un dataset issu d’une requête a une base sql on veut exporter et transférer les données vers un système Unix.

Comme indiqué dans le code, a la suite de la validation du fait que le résultat de la requête contienne des données (RequestSQL OK),  on converti le dataset en csv vers un fichier local ($FullLocalFile):

($DataSet.Tables[0] | convertto-csv -Delimiter « ; » -NoTypeInformation)  | Out-File -FilePath $FullLocalFile

Puis on récupère le contenu du fichier pour ensuite le convertir au format UTF8 (au passage on écrase le fichier d’origine):

$content=get-content $FullLocalFile
Set-Content -value $content -Encoding UTF8 -Path $FullLocalFile –Force

Enfin on envoi en ftp le fichier vers le système Unix (en construisant dynamiquement le fichier de commande):

N.B: Il est possible que le mode de transfert (ascii ou binary) ait une influence sur le résultat du transfert. N’hésitez pas a tester les deux cas.

#construction fichier ftpcommands
New-Item -Path « $LocalDirectory\ftpcommands.txt » -ItemType file -Force -value `
« open monserverunix
user1
password
ascii
cd /monappli/data
lcd $LocalDirectory
mput $FileName
Y
bye »

#Envoi FTP et verification
ftp.exe -s:$LocalDirectory\ftpcommands.txt > « $LocalDirectory\resultatftp.txt »

(…)

#suppression du fichier ftpcommands
Remove-Item -Path « $LocalDirectory\ftpcommands.txt »
Remove-Item -Path « $LocalDirectory\resultatftp.txt »

 

$LocalDirectory=« D:\Data«  $FileName=« data.csv«  $FullLocalFile=« $LocalDirectory\$FileName«  (…) #Si le dataset est vide => Echec de la requête => $RequestSuccess=$false If (($DataSet.Tables[0] | MeasureObject).count -eq « 0« ) { $RequestSuccess=$false writehost ForegroundColor blue « Dataset vide – FIN DU SCRIPT«  Exit } Else { $RequestSuccess=$true writehost ForegroundColor green « RequestSQL OK«  #Export du fichier CSV en local ($DataSet.Tables[0] | converttocsv Delimiter « ;«  NoTypeInformation) | Out-File FilePath $FullLocalFile #Recuperation du contenu et conversion en UTF8 pour compatibilité Unix $content=getcontent $FullLocalFile SetContent value $content Encoding UTF8 Path $FullLocalFile Force } #construction fichier ftpcommands NewItem Path « $LocalDirectory\ftpcommands.txt«  ItemType file Force value ` « open monserverunix user1 password ascii cd /monappli/data lcd $LocalDirectory mput $FileName Y bye«  #Envoi FTP et verification ftp.exe s:$LocalDirectory\ftpcommands.txt > « $LocalDirectory\resultatftp.txt«  (…) #suppression du fichier ftpcommands RemoveItem Path « $LocalDirectory\ftpcommands.txt«  RemoveItem Path « $LocalDirectory\resultatftp.txt«