Clustered Server 2012 R2 with 2 EMC SAN’s backing it up in a geo dispersed location setup

We were upgrading from server 2008 based cluster to server 2012 R2 based cluster and we learning the steps outlined below after a lot of testing:

Software needed:
* Server 2012 R2 iso
* MirrorView CE Base 4.2
* MirrorView Plugin 4.2.0.1
* Powerpath 6.0 (B401)
* SolutionsEnabler 7.6.1.0

Steps:
– Fail everything over to one side of the cluster thus making the first server emtpy of possible critical roles.
– Have your SAN admin remove the old disks
– Reinstall the OS (we had slipstreamed nearly all the updates needed to shorten the windows updates process afterwards)
– Add Failover Cluster Manager & .Net Framework 3.5 as features of the install that’s you’ve just done
– Install MirrorView Cluster Enabler Base
Reboot your server
– Install Solutions Enabler
– Install MirrorView Plugin
– Install Powerpath (Default MPIO is not enough for EMC disks to be recognized as 1 disk if they are presented over multiple paths)
– Allow your machine access to the EMC SAN thourgh this command:

symcfg authorization add -host ip-of-the-san -username ******** -password ********

– Have your SAN admin add the new disks
Reboot your server
– Install all needed Windows updates + install update 2962409 (there are multiple cluster fixes in there) if not automatically done
– Add your application that you want to cluster and configure everything on 1 host
– Do the exact same thing on the other node of your cluster and add it to the failover cluster in Windows but stop after this and first go run the EMC Cluster enabler Manager
– Choose: “Configure a cluster” and click next untill you can hit finish, this should take care of creating cluster groups

You should now have a cluster that is capable of failing over with 2 EMC SAN’s backing it up in a geo dispersed location.

Bangkok, dag 1

Goedemorgen

We zijn er geraakt! De vliegreis is feitelijk zonder veel problemen verlopen, het was altijd zeer druk om in te stappen op de 2 luchthavens die we gedaan hebben maar met een beetje geduld viel dat allemaal goed mee.
Na 2 keer een uur of 6 gevlogen te hebben zijn we dan gearriveerd in Bangkok, een paar security checks later staan we dan buiten en gaan we op zoek naar de gereserveerde taxi. In de mail die we daarover gekregen hebben staat feitelijk alles juist beschreven maar wie heeft tijd om dat te lezen? Gate 3 op floor 2, daar vonden we onze taxi chauffeur met een papier afgedrukt met ‘Mr. Boons’ op. We gingen er toch vanuit dat er niet teveel andere mensen Boons zouden heten en hebben dan deze taxi chauffeur maar gevolgd.
Een paar files en een uurke later staan we voor 1000 Baht aan ons hotel waar we meteen Patrick (VanAcker) tegenkomen. Die was blijkbaar aan het informeren of wij daar al waren onder de naam ‘Boons’ of ‘Herman’ maar aangezien de reservatie onder mij naam was gemaakt, vonden de receptionisten niet veel terug.
Reservatie was in orde, kamer 607 en 608 is voor ons. Even opfrissen en op weg naar het Ambassador hotel, samen met Patrick, om naar het Belgian team te gaan kijken. De mannen waren blijkbaar just gaan lopen, in een zweet pak, om nog een paar grammen kwijt te geraken. ‘t Is hier heel streng blijkbaar. Na een kort babbelke gaat Dries en de anderen slapen en gaan wij iets eten.
Wat ik juist gegeten heb weet ik niet, maar het viel wel mee. Noedels met varkensvlees

Recover RAID from Thecus N299

Mijn zéér oude NAS heeft onlangs de geest gegeven en daar stond toch wel wat belangrijke data op dus die wou ik wel terug hebben. De N299 heeft een capaciteit van 2 disks dus had ik RAID-1 (mirroring) geconfigged.
Eerst heb ik proberen te recoveren via partition tools en andere maar uit frustratie dat die tools allemaal zo langzaam werken was ik ondertussen op internet aan het zoeken naar een manier om een raid array te recoveren die in een NAS gezeten had. Ik kwam een post tegen die de volgende commando’s gaf (ik vind de orginele post nu niet meer terug natuurlijk 🙁 ) :

mdadm --assemble --scan

Vervolgens kreeg ik zéér goed nieuws:

mdadm: /dev/md0 has been started with 1 drive (out of 2)
mdadm: /dev/md1 has been started with 1 drive (out of 2)

Verder heb ik dan gekeken waar dat de disk gemount werd via het volgende commando

mount

Daarna kon ik naar de map cd’en en ownership nemen door het volgende commando te geven

chown -R xdragon backup/

Ik weet niet precies wat de kans is dat mijn gewoon linux systeem en het systeem dat in de N299 draaide van ongeveer dezelfde versie mdadm voorzien waren, maar ik vermoed dat ik enorm geluk heb gehad.
Ik heb alleszins een nieuwe NAS gekocht ondertussen en alles zal binnenkort daar opnieuw naar gekopieerd worden.

Powershell to add 1 VLAN to all servers on a vSwitch

Here you can find a script that requires 1 file as input (CSV) which contains a header “hostname,vswitch”
You fill in the csv with all the hosts and the vswitches that you need to add a VLAN to and this script will add it automatically to those servers defined in the csv-file.

#laad de powerCLI te vinden op de site van VMware

Add-PSSnapin VMware.VimAutomation.Core

#verbind naar he Vcenter (dat kunnen er meerdere zijn)

connect-viserver ip-adress-van-je-vcenter
connect-viserver ip-adress-van-je-vcenter

#De CSV file die de gegevens bevat voor hostnaam en vSwitch nummer

$name = import-csv ..\..\input_hosts.csv
$naamVLAN = Read-Host 'Geef de naam op van de VLAN die je wilt toevoegen?'
$vlanid = Read-Host 'Geef de VLAN ID op die je wilt toevoegen'


foreach ($hostnaam in $name) {
get-vmhost -name $hostnaam.hostname | get-virtualSwitch -name $hostnaam.vswitch | New-VirtualPortGroup -name $naamVLAN -vlanid $vlanid
}

Powershell: To Unpack – Check – Combine – Mail SPDisposechecks

The script below will unpack all WSP’s in your Sharepoint farm. If there are custom built solutions, they will have to be checked.
This script checks the unpacked WSP’s, combines the results in 1 file and then mails the results to you, from there you can build a nice report to be sent.

Prerequisites:
SPDisposeCheck must be installed

View – copy the code below

cls
Write-Host "**************************************************************************************************"
Write-Host "| This script will unpack the WSP packages that it finds in a provided directory                 |"
Write-Host "**************************************************************************************************"
Write-Host

$wspdir = "\\Dir-to-be-saved"
$lastCreatedDir = Get-ChildItem -Path $wspdir | Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending | Select-Object -First 1
$exportdir = "$wspdir\Export-$((get-date).toString('yyyyMMdd-hhmmss'))\"

#Retrieve the wsp files in this folder and subfolders
$s = [system.IO.SearchOption]::AllDirectories
$fileEntries = [IO.Directory]::GetFiles($lastCreatedDir.FullName,"*.wsp",$s); 

foreach($fullFileName in $fileEntries) 
{ 
	$fileName = $(Get-Item $fullFileName).Name;
 	$dirName =  $fileName.Replace(".wsp","");
	$path = $exportdir + $dirName;
 	$dir = [IO.Directory]::CreateDirectory($path) 

	#uncab
	Write-Host "Export $fileName started" -ForegroundColor Yellow
	$destination = $path
	C:\Windows\System32\extrac32.exe $fullFileName /e /Y /L $destination
}

#Wait for the unpack to be complete

sleep 75

Write-Host "**************************************************************************************************"
Write-Host "| This script will run the SPDisposeCheck tool on each dll that it finds in a provided directory |"
Write-Host "**************************************************************************************************"
Write-Host

$Dir = get-childitem $exportdir -recurse
$List = $Dir | where {$_.extension -eq ".dll"}

$export = $destination+"\"+"SPDisposeCheck_$((get-date).toString('yyyyMMdd-hhmmss'))"
$dir = md $export

$List | ForEach-Object {
	Write-Host $_.name "is being checked..."
	$report = $export+"\"+$_.name+".spdisposecheck.txt"
	& "C:\Program Files (x86)\Microsoft\SharePoint Dispose Check\SPDisposeCheck.exe" $_.fullname | Out-File $report
}
Write-Host
Write-Host "The reports are stored in "$export
Write-Host



Write-Host "********************************************************************************************************************"
Write-Host "| This script will collect all the SPDisposeCheck result files and create one csv file with them for reporting     |"
Write-Host "********************************************************************************************************************"
Write-Host

#Retrieve the wsp files in this folder
$fileEntries = [IO.Directory]::GetFiles($export,"*.txt");

$counter = 0;
$coll = @();

foreach($fileName in $fileEntries) 
{ 
	$content = Get-Content $fileName;
	$obj = new-object PSObject
	
	foreach($line in $content){
		#check if this line starts with ID: SPDisposeCheckID_
		if($line.StartsWith("ID: SPDisposeCheckID_")){
			$ID = $line.Replace("ID: SPDisposeCheckID_","");
			
			if($ID -eq 140){
				continue #false positive
			}
			
			$obj = new-object PSObject
			$obj | add-member -membertype NoteProperty  -name "Path" -value $fileName
			$obj | add-member -membertype NoteProperty  -name "SPDisposeCheckID" -value $ID -Force

			$counter = 0;
			$coll += $obj;
		}
		
		#Method information
		if($counter -eq 2){
			$line = $line.Remove(0,8) #remove Method: from string
			$obj | add-member -membertype NoteProperty  -name "Method" -value $line -Force
		}
		
		#Statement information
		if($counter -eq 3){
			$line = $line.Remove(0,11) #remove Statement: from string
			$obj | add-member -membertype NoteProperty  -name "Statement" -value $line -Force
		}
		
		#Notes information
		if($counter -eq 4){
			$line = $line.Remove(0,7) #remove Notes: from string
			$obj | add-member -membertype NoteProperty  -name "Notes" -value $line -Force
		}
		
		#More information
		if($counter -eq 4){
			$line = $line.Remove(0,18) #remove More information: from string
			$obj | add-member -membertype NoteProperty  -name "More information" -value $line -Force
		}
		
		$counter++
	}
	
	$coll | export-csv -Delimiter ';' "$wspdir\spdisposecheckrapport.csv" -notypeinformation
} 


Write-Host "********************************************************************************************************************"
Write-Host "| This script will send mail to anyone you config below                                                       	   |"
Write-Host "********************************************************************************************************************"
$EmailFrom = "<to-be-filled-in>"
$EmailTo = "<to-be-filled-in>"
$EmailSubject = "SP_Disposecheck"  
  
$SMTPServer = "to-be-filled-in"
$SMTPAuthUsername = ""
$SMTPAuthPassword = ""
$emailattachment = "to-be-filled-in"
$mailmessage = New-Object system.net.mail.mailmessage 
$mailmessage.from = ($emailfrom) 
$mailmessage.To.add($emailto)
$mailmessage.Subject = $emailsubject
$mailmessage.Body = $emailbody
$attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'text/plain')
  $mailmessage.Attachments.Add($attachment)

#$mailmessage.IsBodyHTML = $true
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)  
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$SMTPAuthUsername", "$SMTPAuthPassword") 
$SMTPClient.Send($mailmessage)

Scripts combined from Tom van Gaever

Tegels in de garage

die zijn af! (laatste invoeging op zondag 7 april 2013)

Allé, de tegels zijn natuurlijk al een tijdje gelegd, maar we waren bezig met het invoegen ervan en uiteindelijk zijn we er ook mee klaar geraakt. We hebben natuurlijk niet altijd alle weekends ten volle kunnen benutten, maar uiteindelijk is alles toch klaar geraakt.

Het volgende waar de schrijnwerker mee bezig is zijn de definitieve trappen. Deze hebben we nodig vanwege het EPB dossier wat anders niet in orde kan komen. Doordat we alle trappen boven elkaar hebben staan van de kelder tot op de zolder en er tussen de trappen geen afsluitingen zitten kan bv zo een luchtdichtheidsmeting nooit geen goede resultaten opleveren, maar dat is niet de grootste reden. De belangrijkste factor is dat alle ruimtes met elkaar verbonden zijn op die manier en dat daar enorm veel punten voor afgetrokken worden en boetes voor gegeven worden. Dus blijkt nu ineens dat die trappen een prioriteit zijn. Dat zal ook wel de bezigheid van de komende weekends worden. Ik moet zetten dat ik er wel naar uitkijk! De trap naar de zolder zal een vol beuken trap worden. Hier zal niet veel speciaals aan zijn, gewoon een rechte trap van verdieping naar verdieping zonder draaiing in. Beneden zal het toch iets anders worden. Beneden zal de trap volledig uit eik bestaan en volledig dicht gemaakt worden (met stoottrede dus). De trap zal bestaan uit twee of drie treden naar een platform toe, daar moet je draaien en het volgende stuk op gaan. Het zal zeker geen bombast worden, maar schoon in elk geval wel!

Geen pics deze keer!

Tegels – Deel II

Daar zijn we vorig weekend aan begonnen!
We moesten nog tegels voorzien in de garage en in de berging en daar zijn we aan begonnen. Het is toch weer helemaal anders werken als met die grote tegels hoor. Die vorige “kastaars” kon je niet eventjes herleggen of aanpassen terwijl dat met deze tegels veel beter gaat. Deze zijn maar 30×30 cm en dat werkt veel gemakkelijker, natuurlijk moet je er daar ook meer van leggen om dezelfde oppervlakte toe leggen als met die vorige.

Er zijn een paar foto’s genomen, maar ik heb ze niet bij, dus zullen ze later toegevoegd worden.

Weer meer gebeurd

Er is een hele keuken geïnstalleerd! Awel, zo lijkt het toch, kasten hadden we al, maar de machines voor er in waren er nog niet allemaal of was nog geen tijd voor geweest om die in te bouwen. Maar daar is dit weekend verandering in gekomen. Er is hard doorgewerkt en daarmee hebben we nu een extra meubel in de keuken en twee in de badkamer:

Verder is er dan ook nog gewerkt aan de plinten boven op de laminaat, daar hebben we 2 kanten van 1 kamer af. Daar kruipt redelijk wat werk in, maar het resultaat mag er dan ook zijn. Om de 40 cm zo een houdertje in de muur boren, 2 pluggen en uiteraard 2 vijzen. Daar ben je eventjes meer zoet.

Verder zowat het belangrijkste van het hele weekend, we hebben een brievenbus gezet! Kunnen we eindelijk posten ontvangen op ons eigen adres.

Het stukje aan de straat kant, waar voorheen nog niets mee gedaan was, hebben we nu een aantal keer gefreesd en dan daar gras ingezaaid.

Dus al bij al was dit een druk bezet weekend! Nieuwe foto’s kan je weeral vinden bij de vaste hoster van dienst, Google.

Weinig gebeurd

Tja, als er niet veel gebeurd is in het weekend omdat het vol gepland stond met andere afspraken, dan kan ik niet veel tonen. We zijn dus niet echt verder geraakt. De plinten voor boven liggen nog steeds op ons te wachten. Er zijn een aantal kasten nog extra verhuisd, maar die hebben we voorlopig ook nog allemaal in de garage staan want als we die in de kamers gaan zetten, zullen ze in de weg staan als we de plinten gaan zetten.

De oven, het vuur en de dampkap is wel toegekomen, dus die ben ik dan zaterdag voormiddag gaan halen. Het kastje waar de oven in moest komen was al zo goed als af, dus stonde oven er snel in. Hij staat ook al bij ons, maar nog niet alles is vast gezet en er moeten ook nog een paar aanpassingen gebeuren voor dat alles definitief kan staan.

In de badkamer moeten ook nog de lavabo’s in het meubel in gebouwd worden zodat we onze tanden niet meer in de keuken moeten poetsen, maar gewoon in de badkamer.

Nieuwe update

Zo, we zijn weer aan een nieuwe update toe. Ons huishoud elektro begint zo stilletjes aan binnen te komen. De koelkast en de diepvries hadden we reeds geleverd gekregen. Gisteren is de oven geleverd, die had Herman nodig om verder aan de keukenkast te kunnen werken. Daar bovenop moet natuurlijk ook nog het vuur komen, maar dat is nog niet geleverd.
We zijn ook vorig weekend plinten gaan halen voor de vloer boven verder af te werken, maar we hebben nog geen tijd gehad om die te plaatsen. Volgend weekend gaat ook al redelijk druk zijn met andere zaken, dus weten we ook niet of het er dan van zal komen.

Voor nu heb ik dan tenminste nog de foto’s die nog op mijn fototoestel stonden geüpload.