Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Powershell/VMWare] 10+ Snapshots maken

Pagina: 1
Acties:

  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 26-11 16:27
Alvast bedankt voor het lezen van mijn topic.

Een keer per maand willen we snapshots maken van alle productie servers.
Hiervoor hebben wij binnen Dell Kace een aantal patching groepen gedefinieerd.
Bijvoorbeeld Domain Controllers, Fileservers, SQL servers etc.

Per groep trappen we een powershell script af die voor ons snapshots maakt. Klinkt prima toch?
Het script werkt wel in ieder geval maar is onbetrouwbaar als je meer dan 5 snapshots maakt per keer.

Ik denk te weten waarom het script niet altijd 100% werkt.

Per keer dat het script draait wordt er een powershell session gemaakt en een process genaamd wsmprovhost.exe. Powershell kan een maximum van 5 sessies.

Per process wordt er 150Mb memory gebruikt. Dit process draait het script maar het process wordt nooit gestopt. Dit zorgt ervoor dat als er ongeveer 50 snapshots gemaakt worden, het geheugen vol loopt.

Eigenlijk gebruiken wij twee scripts:
Eerste script om het tweede script onder een andere gebruiker te draaien.
Tweede script om de VMware snapshots te maken.

code:
1
2
3
4
5
6
$User="domain\username"
$Pass = ConvertTo-SecureString "Password" -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Pass

$LocalName=gc env:computername
Invoke-Command -ComputerName ComputerName -FilePath SnapNow.ps1 -ArgumentList $LocalName -Credential $credentials


code:
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
Add-PsSnapin VMware.VimAutomation.Core

$vc = "vCenterServerName.domain"

Connect-VIServer -server $vc -user domain\user -password Password

$path = "path\logfile.txt"
$today = get-date -format g
$today_str = (get-date).tostring('yyyy-MM-dd')

if(!(Test-Path -Path $path))
    {
    $logfile = New-Item -type file $path -force
    }

foreach ($arg in $args)
{
 $VM = Get-VM -name $arg
 Add-Content $path "$today $VM"
 Try{New-Snapshot -VM $VM -Name "MW $today_str" -Description "Auto MW Snap on $today_str"}
 Catch{$_.exception | select *; add-content $path "$today $VM Failed!";}
}

Disconnect-VIServer -server $vc -Confirm:$False -Force
Remove-PsSession -session (Get-PsSession)


Dus heeft er iemand een manier om me te helpen?
Of heeft er iemand al een script om dit te doen?

  • Question Mark
  • Registratie: Mei 2003
  • Laatst online: 28-11 16:59

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Afgezien van je issue, maar waarom zou je een snapshot willen maken van al je produktiesystemen? Dit kost je gewoon ontzettend veel I/O performance.
When a snapshot is created, the VMware product produces an additional delta file. Each successive snapshot produces an additional file. When a disk operation is performed within the guest, the disk I/O is recreated by parsing each snapshot delta file in the chain. This produces additional disk overhead on the host because more than one file must be opened and processed to recreate the I/O data for the guest operating system. For best performance, remove all snapshots in the guest operating system or store performance-sensitive data on an independent virtual disk.
Een snapshot is leuk als je even een patch uitrolt of iets dergelijks en even een dag een snelle rollback optie wilt hebben, maar niet meer dan dat.

MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B


  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 26-11 16:27
Eens per maand is er met de business afgesproken dat er geen productie draait.
In dit weekend worden dus alle windows patches, service packs, application upgrades, configurations gedaan die niet tijdens kantoor uren gedaan kunnen worden.

Dus op vrijdagavond worden er snapshots gemaakt en die worden dan een paar dagen later automatisch weggegooid. Dus het is inderdaad alleen een snelle restore aangezien de productie op maandag gewoon meer moet draaien. Dan wil je min mogelijk tijd verspillen met servers terug zetten van de backup en meer tijd besteden aan het oplossen van je issue. Of natuurlijk een rollback maar ook deze moet uitvoerig getest worden.

  • ro3lie
  • Registratie: April 2009
  • Laatst online: 23:06
Als je onderhoud altijd op een vast moment in de maand plaats vind kan je toch ook gewoon per VM een taak aanmaken binnen Scheduled Tasks van vCenter?
Deze maakt van per VM een snapshot en stuurt je eventueel nog een e-mail qua status. Dit kan je ook instellen voor het deleten.

Om ze per groep te doen laat je de VM's die bij elkaar horen op dezelfde tijd starten.

Andere optie omtrent je Powershell sessie issues, allicht kan je kijken naar vMA van VMware.

[ Voor 53% gewijzigd door ro3lie op 27-02-2014 17:21 ]


  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 26-11 16:27
Ik heb nu een andere optie gevonden.
In plaats van een sessie op te zetten vanuit elke machine, zet ik slechts een enkele sessie op vanuit de vCenter server.

Requirements:
Een .txt bestand dat per regel een servernaam heeft.
Dus de inhoud zou er zo uit moeten zien.

Server1
Server2
Server3

Voorbereiding:
De volgende variabele moeten aangepast worden
$client="Company"
$from="SnapshotOverview@company.com"
$to="firstname.lastname@company.com"
$smtp_host="smtp"
$vc = "vCenterServerName"
$filepath = "PathToTextFile.txt"

Ook moet de username en password ingevuld worden
Connect-VIServer -server $vc -user "domain\user" -password "Password"

Functie:
Dit script maakt een verbinding naar de vCenter server.
Per regel in de .txt file wordt het VMware object opgehaald en vervolgens een snapshot gemaakt.
Dit wordt gedaan met 10 snapshots per keer.
Nadat ze allemaal gemaakt zijn wordt er gekeken of de snapshot ook echt gemaakt zijn.
Dit wordt vervolgens via smtp naar een emailadres gestuurd.

Test:
Getest met 200 servers.

Verbeteringen:
Verwijder de interval van 10 snapshot per keer om het sneller te laten verlopen.
Controleer of snapshots al bestaan voordat een nieuw snapshot gemaakt wordt. (Zodat het script opnieuw gedraaid kan worden als er snapshot fout lopen.)


code:
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
89
90
#Set Variables
$vc = "vCenterServerName"
$filepath = "PathToTextFile.txt"
$today_str = (get-date).tostring('yyyy-MM-dd')
$i = 0
$client="Company"
$from="SnapshotOverview@company.com"
$to="firstname.lastname@company.com"
$smtp_host="smtp"
$found_error=0
$error_count=0
$server_count=0
$body="The following Virtual Machine(s) contain a Snapshot:`n"
$body2="Entire Log:`n"

Add-PSSnapin VMware.VimAutomation.Core

#Get stats from the txt file
$TotalRowCount = Get-Content $filepath | Measure-Object
#Get to total amount of records
$RowCount = $TotalRowCount.Count

#Connect to the vCenter Server
Connect-VIServer -server $vc -user "domain\user" -password "Password"

#Cycle through the rows
for ($i=0; $i -lt $RowCount; $i++)
{
    Start-Sleep -s 1
    
    #Get 1 line from the file
    $vmname = Get-Content -Path $filepath | Select-Object -Index $i
    #Get VM object based on the name
    $VM = Get-VM -name $vmname
    
    #Create the snapshot
    New-Snapshot -VM $VM -Name "MW $today_str" -Description "Auto MW Snap on $today_str"
    
    #Make sure you can divide the amount by 10   
    If($i -eq 0) #To avoid waiting 30 seconds at the start. 
    {
        Write-Host "Skipping the wait for line 0"
    }
    ElseIf(($i % 10) -eq 0)
    {
        #Sleep 60 seconds after 10 intervals
        Start-Sleep -s 60
    }
}

#Set i back to 0
$i = 0
for ($i=0; $i -lt $RowCount; $i++)
{
    #Sleep 1 seconds before checking snapshot
    Start-Sleep -s 1
    
    #Get 1 line from the file
    $vmname = Get-Content -Path $filepath | Select-Object -Index $i
    #Get VM object based on the name
    $VM = Get-VM -name $vmname
    #Get Snapshot object based on the name
    $snapshot = get-snapshot -VM $VM
    if ($snapshot) {
        $found_error=1
            $error_count++

        Write-Host $VM.Name ": Snapshot found!"
        $body+="`t"+ $VM.Name + " " + $snapshot.Created +": Snapshot found! Snapshot name: "+ $snapshot.Name +"`n" #Add line to the body when snapshot found (Short VM list)
        $body2+="`t"+ $VM.Name + " " + $snapshot.Created +": Snapshot found! Snapshot name: "+ $snapshot.Name +"`n" #Add line to the body when snapshot found (Entire log)
    } 
    else 
    {
        Write-Host $VM.Name ": Snapshot not found."
        $body2+="`t"+ $VM.Name + " " + $snapshot.Created +": Snapshot not found.`n" #Add line to the body when failed (Entire log)
    }
}

if ($found_error) {
    #Subject
    $subject=$client +": "+ $error_count + "/" + $RowCount +" Snapshot(s) found!"
    $smtp = new-object System.Net.Mail.SmtpClient($smtp_host)
    #Create message
    $message = New-Object System.Net.Mail.MailMessage "${from}", "${to}", "${subject}", "${body}`n${body2}"
    #Send the email
    $smtp.Send($message)
}

#Disconnect from the vCenter Server
Disconnect-VIServer -server $vc -Confirm:$False -Force


P.S. Het SMTP stuk is niet mij eigen code, slechts aangepast.

  • brid
  • Registratie: Januari 2001
  • Laatst online: 19-11 18:24

brid

Onze excuses voor het ongemak

Kan het toch niet laten kijk, even naar de documentatie https://www.vmware.com/su...U1/html/New-Snapshot.html

je kan je snapshots async aan maken wat er voor zorgt dat je een task terug krijgt en gebruik voor het doorlopen van een array een foreach loop

in semi-psuede
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$Snapshots= @()
$Servers = get-content c:\bla\servers.txt

Foreach($server in $servers)
{
    $VM = get-vm $Server
    $Snapshots+=new-snapshot $VM -async
    while(($snapshots|where {($_.State -eq "Running") -or ($_.State -eq "queued") }).count -eq 10) <- dit is ongeveer werk
    {
        Sleep 30
    }
}

Ongeveer zelfde while totdat state Success of error voor alles of er geen queued of running is in $Snapshots
State -eq "Success"
Doe wat je wilt bij succes

State -eq "Error"
Doe wat bij fout moet

#Verstuur mail
Send-mailmessage -to "pietje@hier.nl" -body $String_met_je_bericht -smtp "smtp.hier.nl" -attachment $logfilepath -subject "snapshots gereed"

[ Voor 9% gewijzigd door brid op 06-02-2015 22:38 ]

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!

Pagina: 1