Operations Lab.

Windows Server 2012 Community Day で使用したデモスクリプト

leave a comment »

Windows Server 2012 Community Day で使用したデモスクリプトを公開します。

デモ用に作成していて、そのまま公開する予定はなかったのですが(きちんとまとめて、別のエントリとしてブログに書こうと思っていた)、まとめるのに時間がかかりそうなので、一旦あるがままで載せておきます。特定の環境でしか動かない様な書き方をしている部分もありますので、ご了承ください。エラー処理が絶対的に足りていないので、本番環境へそのまま適用することはお勧めしません。

※利用は、自己責任でお願いします。

DSC の構成

cls
Set-Location C:\PowerShell

$cred = Get-Credential
$s = New-PSSession 10.200.0.100 -Credential $cred
Enter-PSSession $s

cls
New-Item -ItemType Directory C:\PowerShell -Force
Set-Location C:\PowerShell

# Azure の場合は必要
#Enable-PSRemoting -Force
Get-WindowsFeature | ? Installed

Configuration WebServerConfig
{
    param($Name)

    Node $Name
    {
        WindowsFeature FTPRole
        {
            Name = "Web-FTP-Server"
            Ensure = "Present"
            IncludeAllSubFeature = $true
        }
        
        WindowsFeature TelnetRole
        {
            Name = "Telnet-Client"
            Ensure = "Present"
        }
        
        WindowsFeature TelnetServerRole
        {
            Name = "Telnet-Server"
            Ensure = "Absent"
        }
        
        WindowsFeature WSBRole
        {
            Name = "Windows-Server-Backup"
            Ensure = "Absent"
        }
    }
}

WebServerConfig -Name svw12r2-sv31
Get-WindowsFeature Telnet*,Web-FTP*,*Backup
Start-DscConfiguration -Wait -Verbose -Path .\WebServerConfig
Get-WindowsFeature Telnet*,Web-FTP*,*Backup

exit
Disconnect-PSSession $s
Remove-PSSession $s

Copy-VMFile

cls
Set-Location C:\PowerShell

Copy-VMFile -FileSource Host -Name svw12r2-sv31 -SourcePath C:\PowerShell\_Unattend.xml C:\
Copy-VMFile -FileSource Host -Name svw12r2-sv31 -SourcePath C:\PowerShell\_Unattend.xml C:\Windows

Cross-version Live Migration

cls
Set-Location "C:\PowerShell"

$vmprefix = "test"
$vhdbase = "C:\Hyper-V\vhd\"
$memsize = 256MB
$hvsw = "external"

$sb = {
    param($vmprefix, $vhdbase, $memsize, $hvsw)
    1..3 | % {
        $vmname = $vmprefix + $_.ToString("00")
        $vhdfile = $vhdbase + $vmname + ".vhdx"
        New-VHD -Path $vhdfile -SizeBytes 100MB -Dynamic
        New-VM -Name $vmname -MemoryStartupBytes $memsize -VHDPath $vhdfile -SwitchName $hvsw -BootDevice IDE
        Set-VMProcessor -VMName $vmname -CompatibilityForMigrationEnabled $true
        Start-VM -Name $vmname
    }
}

$clean = {
    param($vmprefix = "test", $vhdbase = "C:\Hyper-V\vhd\")
    Stop-VM -Name ${vmprefix}* -Force -TurnOff
    Remove-VM -Name ${vmprefix}* -Force
    Remove-Item -Path ${vhdbase}${vmprefix}* -Force
}

$srchv = "svw12-hv11"
$dsthv = "svw12r2-hv01"
$dstpath = "C:\Hyper-V\vhd"

Get-VM -ComputerName $srchv
Invoke-Command -ComputerName $srchv -ScriptBlock $clean
Invoke-Command -ComputerName $srchv -ScriptBlock $sb -ArgumentList $vmprefix,$vhdbase,$memsize,$hvsw

$targetvm = "test01"
Get-VM -ComputerName $srchv
#Start-VM -ComputerName $srchv -Name $targetvm
Get-VM -ComputerName $srchv -Name $targetvm

Move-VM -ComputerName $srchv -Name $targetvm -DestinationHost $dsthv -IncludeStorage -DestinationStoragePath $dstpath
#Measure-Command { Move-VM -ComputerName $srchv -Name $targetvm -DestinationHost $dsthv -IncludeStorage -DestinationStoragePath $dstpath }

Get-VM -ComputerName $srchv
Get-VM -ComputerName $dsthv

構成変更前にスナップショットを作成し、構成変更に失敗したら元に戻す

成功するパターン

cls
Set-Location "C:\PowerShell"

$target = "svw12r2-sv01"
$s = { Install-WindowsFeature Telnet-Client | Out-Null ; $? }
#$s = { Install-WindowsFeature Hyper-V | Out-Null ; $? }

Get-VM -Name $target
Get-VMSnapshot -VMName $target

$sn = $target + " # " + (Get-Date -UFormat "%Y-%m-%d %H:%M:%S")
Write-Host "スナップショットを取得します..."
Checkpoint-VM -Name $target -SnapshotName $sn
Get-VMSnapshot -VMName $target

$ss = Get-VMSnapshot -VMName $target -Name $sn
$ret = Invoke-Command -ComputerName $target -ScriptBlock $s
if($ret) {
    Write-Host "スナップショットを削除します..."
    Remove-VMSnapshot -VMSnapshot $ss
} else {
    Write-Host "スナップショットの状態へ復元します..."
    Restore-VMSnapshot -VMSnapshot $ss -Confirm:$false
    #Write-Host "スナップショットを削除します..."
    #Remove-VMSnapshot -VMSnapshot $ss
}

Get-VMSnapshot -VMName $target

失敗するパターン

cls
Set-Location "C:\PowerShell"

$target = "svw12r2-sv01"
#$s = { Install-WindowsFeature Telnet-Client | Out-Null ; $? }
$s = { Install-WindowsFeature Hyper-V | Out-Null ; $? }

Get-VM -Name $target
Get-VMSnapshot -VMName $target

$sn = $target + " # " + (Get-Date -UFormat "%Y-%m-%d %H:%M:%S")
Write-Host "スナップショットを取得します..."
Checkpoint-VM -Name $target -SnapshotName $sn
Get-VMSnapshot -VMName $target

$ss = Get-VMSnapshot -VMName $target -Name $sn
$ret = Invoke-Command -ComputerName $target -ScriptBlock $s
if($ret) {
    Write-Host "スナップショットを削除します..."
    Remove-VMSnapshot -VMSnapshot $ss
} else {
    Write-Host "スナップショットの状態へ復元します..."
    Restore-VMSnapshot -VMSnapshot $ss -Confirm:$false
    #Write-Host "スナップショットを削除します..."
    #Remove-VMSnapshot -VMSnapshot $ss
}

Get-VMSnapshot -VMName $target

Hyper-V Replica Test Failover

cls
Set-Location "C:\PowerShell"

$replicahost = "svw12r2-hv02"

$target = @("svw12r2-dc01", "svlwr7-sv61", "svw12r2-sv01")
#$target = @("svw12r2-sv01")
$network = "external-test"

$fo = {
    param($target, $network)
    New-VMSwitch -Name $network -SwitchType Private | Out-Null
    $target | % {
        $vm = Start-VMFailover -AsTest -VMName $_ -Confirm:$false
        Connect-VMNetworkAdapter -VMName $vm.VMName -SwitchName $network | Out-Null
        Start-VM -VM $vm | Out-Null
        $vm.VMName
    }
}

$clean = {
    param($target, $network)
    $target | % {
        Stop-VMFailover -VMName $_
    }
    Remove-VMSwitch -Name $network -Force
}

Get-VM -ComputerName $replicahost
Get-VMSwitch -ComputerName $replicahost

$fovm = Invoke-Command -ComputerName $replicahost -ScriptBlock $fo -ArgumentList $target,$network

Get-VM -ComputerName $replicahost
Get-VMSwitch -ComputerName $replicahost
Get-VMNetworkAdapter -VMName $fovm[0] -ComputerName $replicahost | Format-List VMName,SwitchName

Invoke-Command -ComputerName $replicahost -ScriptBlock $clean -ArgumentList $target,$network

Get-VM -ComputerName $replicahost
Get-VMSwitch -ComputerName $replicahost

VM の展開(DHCP 版)

cls
Set-Location C:\PowerShell

$vmname = "svw12r2-sv111"
$ipaddr = "10.200.0.111"
$netmask = 24

$vhdbase = "D:\Hyper-V\Virtual Hard Disks\"
$vmtpl = "D:\Hyper-V\Virtual Hard Disks\svw12r2-template-sysprep.vhdx"
$unattend = "C:\PowerShell\Unattend-static.xml"
#$unattend = "C:\Users\Administrator\Documents\Unattend.xml"

$tmpvhd = "D:\Hyper-V\Virtual Hard Disks\tmp.vhdx"
$vhdfile = $vhdbase + $vmname + ".vhdx"
$driveletter = "F:\"
$dstfile = $driveletter + "Unattend.xml"

New-VHD -Path $vhdfile -ParentPath $vmtpl -Differencing

$memsize = 2048MB
$hvsw = "Internal"
$gen = 2

$vm = New-VM -Name $vmname -MemoryStartupBytes $memsize -VHDPath $tmpvhd -SwitchName $hvsw -Generation $gen -BootDevice VHD
$vm | Set-VMProcessor -Count 2 -CompatibilityForMigrationEnabled $true
$vm | Enable-VMIntegrationService -Name "Guest Service Interface"

Start-VM $vm
Start-Sleep -Seconds 3
Stop-VM $vm -TurnOff

$macaddr = (Get-VMNetworkAdapter -VM $vm).MacAddress
$s = $macaddr[0] + $macaddr[1] + "-" + $macaddr[2] + $macaddr[3] + "-" + $macaddr[4] + $macaddr[5] + "-" + $macaddr[6] + $macaddr[7] + "-" + $macaddr[8] + $macaddr[9] + "-" + $macaddr[10] + $macaddr[11]

Set-VMHardDiskDrive -VMName $vmname -ControllerType SCSI -ControllerLocation 0 -Path $vhdfile

Mount-VHD -Path $vhdfile
$(Get-Content -Encoding UTF8 $unattend) -replace "@@@@vmname@@@@", $vmname -replace "@@@@ipaddr@@@@", ($ipaddr + "/" + [string]$netmask) -replace "@@@@macaddr@@@@", $s | Out-File -Encoding utf8 $dstfile
Dismount-VHD -Path $vhdfile
Start-VM $vm

VM の展開(Static IP 版)

cls
Set-Location C:\PowerShell

$vmname = "svw12r2-sv199"
$vhdbase = "D:\Hyper-V\Virtual Hard Disks\"
$vmtpl = "D:\Hyper-V\Virtual Hard Disks\svw12r2-template-sysprep-vmmode.vhdx"
$unattend = "C:\PowerShell\Unattend-dhcp.xml"

$vhdfile = $vhdbase + $vmname + ".vhdx"
$driveletter = "F:\"
$dstfile = $driveletter + "Unattend.xml"

New-VHD -Path $vhdfile -ParentPath $vmtpl -Differencing

$memsize = 2048MB
$hvsw = "Internal"
$gen = 2

$vm = New-VM -Name $vmname -MemoryStartupBytes $memsize -VHDPath $vhdfile -SwitchName $hvsw -Generation $gen -BootDevice VHD
$vm | Set-VMProcessor -Count 2 -CompatibilityForMigrationEnabled $true
$vm | Enable-VMIntegrationService -Name "Guest Service Interface"

Mount-VHD -Path $vhdfile
$(Get-Content -Encoding UTF8 $unattend) -replace "@@@@vmname@@@@", $vmname | Out-File -Encoding utf8 $dstfile
Dismount-VHD -Path $vhdfile
Start-VM $vm
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。