Today i had the pleasure to install and configure the Windows PowerShell Web Access in Windows 8. This gives you an opportunity to administer your internal servers with a Web Powershell Console. The really nice part here is that when I have enabled this I can connect to an Windows Server 2008 R2 with Powershell v2.
I have configured it with Authorization to everything, now this is a test environment but in your maybe you should be more restrictive,
So I can connect with for example a Ipad and administer my Hyper-V Cluster in SCVMM2012 😛
In this link you can see how to configure this on your Windows 8 Server Beta.
Here is the login prompt…
And here you can see how i run commands in the console, As you can see I must use Import-Module to import the VMM 2012 cmdlets before I can use them. This is a flash embedded video from youtube (where i uploaded it to) If you do not see it you can go to this link
I still have to find out why I cannot use the PowerCLI PSSnapin, I get an OutOfMemory exception when trying to connect-viserver 🙁 will have to dig a bit deeper to check that one out. Maybe there is a bug in the PSSnapin, an excellent time for VMware to make a Module instead!
I have made a powershell script function to update information about what VLAN and IP the VM´s have. This for the IT Admin to easily see in the VMM 2012 Console. Of course the function can be customized to populate any other information available for the VM´s, maybe you want to display create date or something else that is not in the standard properties and you do not want to use the pre-made custom# .
I am using the Get-IPAddress from Ben Wilkinson, This requires that the VMM server can resolve the IP of the VM´s from a DNS.
If I do not have an DNS or the VLAN info is not stored, i can via the parameters update the properties by -IP or -VLANid.
As you can see on this screen dump, by default i only have custom#, to add my own i have to click on “Manage Custom Properties”
Here i press “Create” and add a name and optionally a description
Then when i have created the custom properties i want i add them,
Then it looks like this,
Now the powershell function comes into play when i am going to populate these fields with information.
a screendump of my powershell console, as you can see I am using the (Get-SCVMHostCluster).Nodes to get all virtual machines on these, also i am using a foreach (%) to run the population on each VM.
I have made a simple powershell function that can move VM´s from one cluster to another and also set the network configuration, this because the old cluster had one way of setup regarding the virtual machine network and the new another more flexible with promiscuous mode set on the HP nic team so i do not need to create one virtual switch for every vlan. The function also checks if the actual VM has snapshots before moving it. (the SCVMM calls it checkpoints, which is stupid to call it one thing in hyper-v and another in SCVMM!)
Had a plan to do a blog post last week but was so busy studying for the VCP 5 test. I wrote the test on friday and i passed 🙂
I have created a little powershell function, this to get the inventory information about the virtual machines running in hosts or clusters that are connected to a System Center Virtual Machine Manager. This function collects number of configured vCPU´s, Memory, information about the connected virtual harddisks. This kind of information could be handy as in the case with one customer that has not yet implemented a host based backup solution and still use agents in their VM´s, so if they need to recover machines it is good to know what size and configuration it had if it is lost by some reason. This report can also be handy for some info on how much your datastores are filled. As you can se i both report the maximum size and the current (as dynamic disks are not allocating the whole size at creation time)
The function both export a csv and a HTML report
After importing it to excel it can look something like this:
And the html output is very simple but can be put on a internal web for IT production
I have used the Get-SCVirtualDisk to get the Bus Type and LUN id as this information is not available in Get-SCVirtualHarddisk, this information can be good if i lost the virtual machine configuration and want to connect the virtual harddisks to the right controller.
the function looks like this: (if you copy this you have to move the first # up to the <, the blog syntax highlighter does something and move it down :-( )
function Get-VMdata{
<#
.SYNOPSIS
Get the configuration data of the VMs in Hyper-V via SCVMM 2012
.DESCRIPTION
Use this function to get all VMs configuration in case of disaster or just statistics
.PARAMETER xyz
.NOTES
Author: Niklas Akerlund / RTS
Date: 2012-02-13
#>
param (
$VMHostGroup = "All Hosts",
[Parameter(ValueFromPipeline=$True)][Alias('ClusterName')]
$VMHostCluster = $null,
$VMHost = $null,
[string]$CSVFile = "VMdata.csv",
[string]$HTMLReport = "VMdata.html"
)
$report = @()
if ($VMHostCluster -eq $null){
$VMHosts = (Get-SCVMHostGroup -Name $VMhostGroup).AllChildHosts
}else{
$VMHosts = (Get-SCVMHostCluster -Name $VMHostCluster).Nodes
}
$VMs = $VMHosts | Get-SCVirtualMachine
foreach ($VM in $VMs) {
$VHDs = $VM | Get-SCVirtualDiskDrive
$i = "1"
foreach ($VHDconf in $VHDs){
if($i -eq "1"){
$data = New-Object PSObject -property @{
VMName=$VM.Name
vCPUs=$VM.CPUCount
MemoryGB= $VM.Memory/1024
VHDName = $VHDconf.VirtualHardDisk.Name
VHDSize = $VHDconf.VirtualHardDisk.MaximumSize/1GB
VHDCurrentSize = [Math]::Round($VHDconf.VirtualHardDisk.Size/1GB)
VHDType = $VHDconf.VirtualHardDisk.VHDType
VHDBusType = $VHDconf.BusType
VHDBus = $VHDconf.Bus
VHDLUN = $VHDconf.Lun
VHDDatastore = $VHDconf.VirtualHardDisk.HostVolume
}
$i= "2"
}else{
$data = New-Object PSObject -property @{
VMName=""
vCPUs=""
MemoryGB= ""
VHDName = $VHDconf.VirtualHardDisk.Name
VHDSize = $VHDconf.VirtualHardDisk.MaximumSize/1GB
VHDCurrentSize = [Math]::Round($VHDconf.VirtualHardDisk.Size/1GB)
VHDType = $VHDconf.VirtualHardDisk.VHDType
VHDBusType = $VHDconf.BusType
VHDBus = $VHDconf.Bus
VHDLUN = $VHDconf.Lun
VHDDatastore = $VHDconf.VirtualHardDisk.HostVolume
}
}
$report +=$data
}
}
$report | Select-Object VMName,vCPUs,MemoryGB,VHDName,VHDSize,VHDCurrentSize,VHDType,VHDBusType,VHDBus,VHDLUN,VHDDatastore | Export-Csv -Path $CSVFile -NoTypeInformation -UseCulture
$report | Select-Object VMName,vCPUs,MemoryGB,VHDName,VHDSize,VHDCurrentSize,VHDType,VHDBusType,VHDBus,VHDLUN,VHDDatastore | ConvertTo-HTML | Out-File $HTMLReport
}
and i can run it in some different ways, as you see in this screenshot, if i do not give any parameters it will use VMHostGroup “All Hosts” as default
After bare metal deployment of the hosts we need to configure the network on the hosts, this can be done from the SCVMM 2012 powershell console.
I have made a function of the creation of first a virtual switch and also adding the logical networks, if i do not add the networks to the particular host nic where the virtual switch is i cannot deploy virtual machines and get them connected to the network.
You can add the logical networks and their associated vlan/subnet before any host is imported into SCVMM and of course i have created a function for that also, this can take a csv file or just the parameters
Here is a screen dump if i run it without a csv file
and the result is the following
And here is the powershell code for the add logical networks function
function Add-SCLogicalNetworks{
<#
.SYNOPSIS
Add logical networks to your SCVMM fabric
.DESCRIPTION
With this function you add logical networks
.PARAMETER CSVNetworks
Path to a CSV file with the logical network info
.NOTES
Author: Niklas Akerlund / RTS
Date: 2012-02-02
#>
param (
$CSVNetworks = "",
$VMHostGroup = "All Hosts",
[string]$Name = "",
[string]$IPnet = "",
[string]$Octet = "24",
[int]$VLAN = 0
)
$VMHostGroup = Get-SCVMHostgroup $VMHostGroup
if ($CSVNetworks -ne "") {
$VLANs = Import-Csv $CSVNetworks -Delimiter ";"
foreach ($VLAN in $VLANs){
$LogicalNetwork = New-SCLogicalNetwork -Name $VLAN.Name
$Network = $VLAN.IPnet + "/" + $VLAN.Octet
$SubnetVlan = New-SCSubnetVLan -Subnet $Network -VLanID $VLAN.VLAN
New-SCLogicalNetworkDefinition -Name $VLAN.Name -LogicalNetwork $logicalNetwork -VMHostGroup $VMHostGroup -SubnetVLan $SubnetVlan
}
}else{
$LogicalNetwork = New-SCLogicalNetwork -Name $Name
$Network = $IPnet + "/" + $Octet
$SubnetVlan = New-SCSubnetVLan -Subnet $Network -VLanID $VLAN
New-SCLogicalNetworkDefinition -Name $Name -LogicalNetwork $logicalNetwork -VMHostGroup $VMHostGroup -SubnetVLan $SubnetVlan
}
}
when i have the logical networks i want to configure the host
And the result is the following
And this is also displayed on the physical nic
and here is the powershell code for configuring the host:
function Configure-SCVMhostNetwork{
<#
.SYNOPSIS
Configure the network on the Hyper-V Host
.DESCRIPTION
With this function you set virtual switch and configure logical networks
.PARAMETER VMHost
The new host that is going to be configurered
.PARAMETER refVMHost
if there are different hyper-v clusters and logical networks, use a ref host for the configuration to set it up
.PARAMETER VMHostnic
The nic that is going to be configured with a virtual switch (in this case a NIC team named "VM"
.EXAMPLE
PS C:\> Get-SCVMHost Hyp04 | Configure-SCVMhostNetwork
.EXAMPLE
PS C:\> Configure-SCVMhostNetwork -VMHost Hyp04 -refVMHost Hyp06
.NOTES
Author: Niklas Akerlund / RTS
Date: 2012-02-02
#>
param (
[Parameter(Position=0,Mandatory=$true,HelpMessage="This need to be a Hyper-V Host name or object",
ValueFromPipeline=$True)]
$VMHost,
[string]$refVMHost = "",
[string]$VirtualNetworkName = "VMs",
[string]$VMHostnic = "VM"
)
$VMHost = Get-VMHost $VMHost
if ($VMHost -ne $null) {
if ($refVMHost -eq ""){
$LogicalNetworks = Get-SCLogicalNetwork
}else
{
$LogicalNetworks = Get-SCLogicalNetwork -VMHost $refVMHost
}
$vmHostNetworkAdapter = Get-SCVMHostNetworkAdapter -VMHost $VMHost -Name $VMHostnic
$virtualNetwork = New-SCVirtualNetwork -VMHost $VMHost -Name $VirtualNetworkName -Description "" -BoundToVMHost $false -VMHostNetworkAdapters $vmHostNetworkAdapter
$vmHostNetworkAdapter = Get-SCVMHostNetworkAdapter -Name $VMHostnic -VMHost $VMHost
foreach ($LogicalNet in $LogicalNetworks){
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $vmHostNetworkAdapter -AddOrSetLogicalNetwork $logicalNet
}
}
}