RDS 2008R2\2012R2 – PowerShell Script de Maintenance.

Bonjour,

rapidement je vous mets à disposition un petit script Powershell qui nous a permis d’automatiser les reboots des serveurs RDS2008R2 d’un client en pleine journée de production.
En effet celui ci rencontre des problèmes d’ouverture de session parfois dans la journée, plus personne ne peut se connecter sur l’un des serveurs de la ferme, avec des chargements de bureau Windows interminable. De plus si le broker décide que c’est ce serveur qui a le moins de session alors il continuera d’envoyer toutes nouvelles ouverture de session dessus.

Nous avons constaté que lorsque ce phénomène ce produit, plusieurs Event ID, le 6004 6005 et 6006 remplissaient le journal d’application.

Pour pallier à cela, une tâche planifiée se déclenche lorsque l’un des Event ID apparait et exécute un script PowerShell qui est le suivant:

La commande exécutée est la suivante:

powershell.exe -ImportSystemModules C:\Scripts\mon-script.ps1

Ci joint le contenu du script:

# On autorise le système d'exploitation à exécuter ce script
set-executionpolicy -executionpolicy unrestricted -force

# configuration de la variable starttime pour correspondre à l'instant T moins 5min
$ts = New-TimeSpan -Minutes 5
$startTime = (get-date) - $ts

# On récupère le nom du serveur
$name = $env:computername

# configuration de la variable Endtime à l'instant T
$endTime = (get-date)

# récupération des erreurs concernant les problèmes d'ouverture de session sur les 5 dernières minutes
$TSE = Get-EventLog -LogName "Application" -source Wlclntfy -After $startTime -before $endTime | where {$_.eventID -eq 6004 -or $_.eventID -eq 6005 -or $_.eventID -eq 6006}

# Je récupère ici la valeur présente dans le fichier. Elle est sensé être à 1 en cas de problème voir plus bas, cela me permet de ne pas continuer le script si un redémarrage est déjà enclenché.
$file3 = get-content C:\Scripts-CIS\plantage-en-cours.txt

if ($file3 -ieq '1'){}
	else {
                # on va ensuite compter le nombre d'erreur dans ce créneau de 5min via $TSE.count
		if ($TSE.count -gt '10'){
                # si plus grand que 10, alors on met en maintenance le serveur
                # on prévient toutes les sessions ouvertes via la fonction msg
		msg * "Vous êtes actuellement connecté sur $name qui va redémarrer pour maintenance d'ici 20min, merci de bien vouloir fermer votre session. L'équipe informatique."
		cd RDS:
		cd .\RDSConfiguration
		cd .\ConnectionBrokerSettings
                # une fois dans l’arborescence de la configuration RDS, on retire le serveur de la fonction LoadBalancing
		Set-Item .\LoadBalancingState 0
                # et on programme le redémarrage de celui ci
		shutdown /r /t 1200 /c "Ce serveur va redémarrer d'ici 20min pour des raisons de maintenance"
                # De cette façon, le problème d'ouverture de session est détecté tôt, le serveur redémarré au bout de 20min laissant le temps aux utilisateurs de fermer leur session.
                # J'en profite pour incrémenter un fichier afin de vérifier après plusieurs jour\semaines combien de fois il s'est auto redémarré.
		$file = get-content C:\Scripts-CIS\count-plantage.txt
		$file2 = [int]$file + 1
		$file2 > C:\Scripts-CIS\count-plantage.txt
                # Je pousse ensuite la valeur 1 au fichier "plantage-en-cours.txt"
                # Ce qui évitera au script de refaire la procédure si un autre Event ID arrivait entre temps.
		echo 1 > C:\Scripts-CIS\plantage-en-cours.txt
		exit
		}
			else {
                # Si $TSE.count plus petit que 10 je ne sors pas encore le serveur de la ferme RDS
                # J'en profite même pour forcer le Loab Balancing à 1. Cette partie est néanmoins facultative.
			cd RDS:
			cd .\RDSConfiguration
			cd .\ConnectionBrokerSettings
			Set-Item .\LoadBalancingState 1
			exit
}}

Il existe un dernier script powershell a ne surtout pas oublier, qui s’exécute au démarrage du serveur et qui a toute mon attention le voici:

# On remet le compteur plantage-en-cours.txt à zero
echo 0 > C:\Scripts-CIS\plantage-en-cours.txt
# On replace le serveur dans le LoadBalancing de la ferme RDS
cd RDS:
cd .\RDSConfiguration
cd .\ConnectionBrokerSettings
Set-Item .\LoadBalancingState 1
exit

Alors certes, on peut voir cela comme un arrêt de production, mais s’agissant d’une ferme RDS, une réouverture de session par l’utilisateur et celui-ci se reconnecte sur un autre RDS de la ferme.
Ce que j’apprécie est que le client n’a plus à nous appeler en urgence parce que ses utilisateurs n’arrivent plus à se connecter; et mine de rien, la plateforme RDS vie toute seule.

En espérant que vous puissiez vous aider de cela pour une problématique similaire, que sais-je !

ps: je vous rassure, nous nous sommes également penchés sur la réelle cause du problème de chargement de session et il semblerait qu’il existe une ou deux KB (KB2575077 et KB2265716) capables de résoudre ces problèmes, à tester …

Maxime

Publicité

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

Retour en haut ↑

Technopreneurph

Technology Entrepreneurship For the World

Chemist Blogger

All things science, technology, and geek culture

Cambly Blog

Practice English with a Native Speaker

BirdsBeep is a Multiplatform Chat Application

BirdsBeep is the uprising of new chatting features that will satisfy.

Deepak verma

Get Latest updates from Famous Tech Blogs in One Blog.

Le mur d'Adrien

De l'administration système pour tous

%d blogueurs aiment cette page :