Hello folks,
As we are approaching the holidays and being busy preparing for Christmas and New Year! I thought let’s end-up the year with a Nano gift J
In the previous post, I showed you step by step on how to run a Hyper-V Cluster on Nano Server.
In today’s blog post, we will set the DNS server address on all Nano Servers using PowerShell Desired State Configuration.
As you might know, Microsoft added new packages into Nano Server in Windows Server 2016 Technical Preview 4.
At the time of writing this post, here is the list of current packages (roles and features) for your reference:
- Microsoft-NanoServer-Compute-Package
- Microsoft-NanoServer-Containers-Package
- Microsoft-NanoServer-DCB-Package
- Microsoft-NanoServer-Defender-Package
- Microsoft-NanoServer-DNS-Package
- Microsoft-NanoServer-DSC-Package
- Microsoft-NanoServer-FailoverCluster-Package
- Microsoft-NanoServer-Guest-Package
- Microsoft-NanoServer-IIS-Package
- Microsoft-NanoServer-NPDS-Package
- Microsoft-NanoServer-OEM-Drivers-Package
- Microsoft-NanoServer-Storage-Package
- Microsoft-OneCore-ReverseForwarders-Package
- Microsoft-Windows-Server-SCVMM-Compute-Package
- Microsoft-Windows-Server-SCVMM-Package
For the purpose of this demo, all you need to do is:
1. Mount the ISO of Windows Server 2016 TP4 installation media.
2. Change to “NanoServer” directory on the TP4 installation media.
3. Import NanoServerImageGenerator.psm1 module.
4. Create Nano image that contains DSC package (you can add other roles if you need to).
5. Create NanoServer Virtual Machines.
6. Download and import xNetworking PowerShell DSC Module.
7. Push the DSC configuration to set the DNS Server.
I am running all the following scripts from PowerShell console as Administrator on Windows Server 2016 Hyper-V TP4 host domain joined and not from PowerShell ISE.
Step 1: Create Nano Server Image
In this step, I will combine point 1 through 4 in one script:
$ServerISO = "C:\10586.0.151029-1700.TH2_RELEASE_SERVER_VOL_X64FRE_EN-US.ISO" Mount-DiskImage $ServerISO $DVDDriveLetter = (Get-DiskImage $ServerISO | Get-Volume).DriveLetter Import-Module C:\NanoServer\NanoServerImageGenerator.psm1 -Verbose $Password = ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force $IP = 140 1..4 | % { New-NanoServerImage -MediaPath "$($DVDDriveLetter):" ` -BasePath C:\NanoServer\ ` -TargetPath $("D:\Hyper-V\NANO-0$_\" + "NANO-0$_" + ".vhdx")` -ComputerName $("NANO-0$_") ` -AdministratorPassword $Password ` -InterfaceNameOrIndex Ethernet ` -Ipv4Address 192.168.1.$IP ` -Ipv4SubnetMask 255.255.255.0 ` -Ipv4Gateway 192.168.1.1 ` -DomainName contoso.com ` -Clustering ` -GuestDrivers ` -Storage ` -Packages Microsoft-NanoServer-Compute-Package, Microsoft-NanoServer-DSC-Package ` -EnableRemoteManagementPort $IP++ } Dismount-DiskImage $ServerISO
If you noticed in above script, we are able to inject the IPv4Address, IPv4SubnetMask and IPv4Gateway. Unfortunately, the DNS Server address is not injected at the time of image creation, this parameter is not included yet in Nano PowerShell module in TP4. The DNS Server is very important when Nano Server is joined to the domain.
Step 2: Create Nano Virtual Machines
In this step, I will create 4 Nano Virtual Machines.
# CREATE 4 NANO VIRTUAL MACHINES $vSwitchName01 = "NAT_vSwitch" $InstallRoot = "D:\Hyper-V" 1..4 | % { New-VHD -Path ($InstallRoot + "\NANO-0$_\NanoServer_D.vhdx") -SizeBytes 50GB -Dynamic New-VM -VHDPath ($InstallRoot + "\NANO-0$_\NANO-0$_.vhdx") -Generation 2 -MemoryStartupBytes 4GB -Name NANO-0$_ -Path $InstallRoot -SwitchName $vSwitchName01 Set-VMProcessor -VMName NANO-0$_ -Count 4 Set-VM -VMName NANO-0$_ -AutomaticStopAction ShutDown -AutomaticStartAction StartIfRunning Enable-VMIntegrationService NANO-0$_ -Name "Guest Service Interface" Rename-VMNetworkAdapter -VMName NANO-0$_ -NewName "MGMT" Set-VMNetworkAdapter -VMName NANO-0$_ -Name "MGMT" -DeviceNaming On Add-VMScsiController -VMName NANO-0$_ Add-VMHardDiskDrive -VMName NANO-0$_ -ControllerType SCSI -ControllerNumber 1 -ControllerLocation 0 -Path ($InstallRoot + "\NANO-0$_\NanoServer_D.vhdx") Start-VM -Name NANO-0$_ | Out-Null }
Step 3: Download and Import DSC xNetworking Module
In this step, I will download and import the xNetworking module which is a part of the DSC Resource Kit produced by the PowerShell Team. This module contains the xIPAddress and xDnsServerAddress resources that allow configuration of a node’s IP Address and DNS Server Address.
# Download xNetworking module from PSGallery Save-Module -Name xNetworking -Path C:\ Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted Install-Module -Name xNetworking # Copy xNetworking Module to all Nano Servers $LocalPassword = ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force $LocalCred = New-Object System.Management.Automation.PSCredential (".\Administrator", $LocalPassword) $IP = 140 1..4 | % { $S1 = New-PSSession -ComputerName 192.168.1.$IP -Credential $LocalCred Copy-Item -Path C:\xNetworking -ToSession $S1 -Destination "C:\Program Files\WindowsPowerShell\Modules" -Recurse -Force Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted Install-Module -Name xNetworking $IP++ }
In the first part of the script, I downloaded the module from PowerShell gallery locally and then I copied it through PowerShell remote session to all Nano Servers instead of download it again from the Internet. This is just awesome.
In PowerShell V5.0, you can copy and send files over PowerShell remote session without the need to use network shares!
As a side note, Windows Management Framework (WMF) 5.0 is now available which is bring support for all the goodness of PowerShell V5.0 to down-level OS (Windows Sever 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 10 Version 1511, Windows 8.1 and Windows 7 SP1).
Step 4: Push DSC Configuration
Before we push the DSC configuration and set the DNS server, I will pull the current DNS address from each Nano Server.
As you can see, we don’t have any IP Address set yet.
I will push the DSC configuration now to all Nano machines.
# Push DSC Configuration $LocalPassword = ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force $LocalCred = New-Object System.Management.Automation.PSCredential (".\Administrator", $LocalPassword) $DNSServerAddress = "192.168.1.9" .\SET-DNSAddress.ps1 -targetNode NANO-01,NANO-02,NANO-03,NANO-04 -DNSServerAddress $DNSServerAddress param ( [String[]]$targetNode, [String]$dnsServerAddress ) configuration xDnsClient { # Importing the resource from custom DSC Module Import-DscResource -ModuleName xNetworking # List of Nano machine which needs to be configured node $targetNode { # Set the DnsServerAddress for given interface xDNSServerAddress dnsServer { Address = $dnsServerAddress AddressFamily = 'IPv4' InterfaceAlias = 'Ethernet' } } } xDnsClient Start-DscConfiguration -Path xDnsClient -Verbose -Wait -ComputerName $targetNode -credential $LocalCred -Force
Count until 5… and Boom!
Last but not least, let’s confirm the DNS address is set on all Nano machines.
Yes indeed!
With that I will sign-off for 2015.
I want to thank the Community, Followers, Readers, Microsoft Product Teams, MVP Award Program, MVP’s, Developers and ITPro’s!
Until then… see you in 2016…
Happy Holidays!
Cheers,
-Charbel