Automatiser le déploiement et la configuration VM Windows IP / DNS / KMS / Domaine / SQL

 

 

Afin de lancer une installation automatique de vos VMs Windows, vous pouvez utiliser les templates et les guest customization proposés par VMware. Cependant, les guest customization ne permettent pas toujours de configurer les VMs de manière fine.

Si vous souhaitez par exemple, renseignez une IP fixe dans différents vlans sans créer un template par vlan, l’enregistrer dans un domaine, l’activer via KMS voir installer une base SQL, vous pouvez utiliser des scripts que vous exécutez au premier boot après le sysprep.

Dans notre cas, nos scripts vont permettent de spécifier l’ip, le masque, la gateway, les DNS de la VM mais également d’enregistrer le serveur auprès d’un serveur KMS, d’ajouter le serveur à un domaine et d’éventuellement installer une base de données.

Nous avons utiliser un template et une guest customization. La guest customization nous permet d’exécuter 3 scripts après l’application du sysprep. Ces scripts sont présents dans le template : 

 

template03

 

Le premier script .bat est le suivant :

 

powershell -command « & {Set-ExecutionPolicy Unrestricted} »
powershell -file « C:\Premier-Boot\Configuration.ps1 »
powershell -command « & {Set-ExecutionPolicy Restricted} »

 

Il permet d’exécuter un script PowerShell « Configuration.ps1 qui se trouve sur le template.

Nous allons décomposer le script Configuration.ps1 en plusieurs partie mais c’est en fait un seul et même fichier.

Le script PowerShell va dans un premier temps demander à l’utilisateur de renseigner l’ip, le masque et la gateway et demander si le serveur est en DMZ et sur quel site (primaire ou secondaire). En fonction des réponses les DNS sont configurés. Cette partie permet d’effectuer la configuration réseau de la VM :

echo « r"
Write-host "######################### CONFIGURATION RESEAU ##############################" -foregroundcolor "Magenta"
echo "
r »

function Set-ServerIpConfiguration {
param(
[string]$ip,
[string]$mask,
[string]$defaultGateway,
[string]$interfaceAlias,
[string[]]$dnsServers
)
$nicIndex = (Get-WMIObject Win32_NetworkAdapter | where {$_.netconnectionid -eq $interfaceAlias}).InterfaceIndex
$nic = Get-WmiObject Win32_NetworkAdapterConfiguration | where {$_.InterfaceIndex -eq $nicIndex}
$nic.EnableStatic($ip, $mask)
$nic.SetGateways($defaultGateway)
$nic.SetDNSServerSearchOrder($dnsServers)
}

Do{
$serverIp = Read-Host ‘Adresse IP ?’
$serverMask = Read-Host ‘Masque ?’
$serverDefaultGateway = Read-Host ‘Gateway ?’
$ConfReseau = Read-Host ‘La configuration réseau est elle correcte ? (Répondre « y » ou « n »)’
$ConfReseau = $ConfReseau.ToLowerInvariant()
} While ($ConfReseau -ne « y »)

Do{
$serverDMZ = Read-Host ‘Serveur en DMZ ? (Répondre « y » ou « n »)’
$serverDMZ = $serverDMZ.ToLowerInvariant()
} While (($serverDMZ -ne « n ») -and ($serverDMZ -ne « y »))

$serverDNSPR = « 2.x.x.250″, »1.x.x.250 »
$serverDNSSE = « 1.x.x.250″, »2.x.x.250 »
$serverDNSDMZ = « 192.x.x.250″, »192.x.x.251 »
$serverInterfaceAlias = « Ethernet »

If ($serverDMZ -eq « y »){
Set-ServerIpConfiguration -ip $serverIp -mask $serverMask -defaultGateway $serverDefaultGateway -interfaceAlias $serverInterfaceAlias -dnsServers $serverDNSDMZ
}
Else{
Do {
$serverDnsServers = Read-Host ‘VM déployée sur Primaire ou Secondaire ? (Répondre « p » ou « s »)’
$serverDnsServers = $serverDnsServers.ToLowerInvariant()
} while (($serverDnsServers -ne « p ») -and ($serverDnsServers -ne « s »))

If ($serverDnsServers -eq « p »){
Set-ServerIpConfiguration -ip $serverIp -mask $serverMask -defaultGateway $serverDefaultGateway -interfaceAlias $serverInterfaceAlias -dnsServers $serverDNSPR
}Else{
Set-ServerIpConfiguration -ip $serverIp -mask $serverMask -defaultGateway $serverDefaultGateway -interfaceAlias $serverInterfaceAlias -dnsServers $serverDNSSE
}
}

 

template04

 

La suite du script permet d’enregistrer la VM via un serveur KMS puis de l’ajouter à un domaine. Selon si l’utilisateur à indiquer que le serveur est en DMZ ou pas, le serveur KMS sera différent. Si le serveur est en DMZ, il n’y aura pas d’ajout dans un domaine :

 

Start-Sleep -s 5
echo « r"
Write-host "########################## ENREGISTREMENT KMS ###############################" -foregroundcolor "Red"
echo "
r »
Write-host « L’enregistrement KMS est en cours » -foregroundcolor « Yellow »
If ($serverDMZ -eq « y »){
C:\Windows\System32\slmgr.vbs /skms 192.x.x.100
}Else{
C:\Windows\System32\slmgr.vbs /skms 1.x.x.15
}
Start-Sleep -s 5
C:\Windows\System32\slmgr.vbs /ato
Start-Sleep -s 5
echo « r"
Write-host "######################### REJOINDRE LE DOMAINE ##############################" -foregroundcolor "Cyan"
echo "
r »

If ($serverDMZ -eq « n »){
Do {
$domainOK = Read-Host ‘Serveur à joindre au domaine Ressources ? (Répondre « y » ou « n »)’
$domainOK = $domainOK.ToLowerInvariant()
} while (($domainOK -ne « y ») -and ($domainOK -ne « n »))
If ($domainOK -eq « y »){
$username = « domain\adminxx »
Write-Host « Compte d’ajout dans le domaine : $username »
$password = Read-Host ‘Renseignez le mot de passe du compte ?’ -assecurestring
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Start-Sleep -s 2
Add-Computer -DomainName « fqdndomain » -Credential $credential -OUPath « OU=Organisation,OU=Serveurs,DC=domain,DC=labo »
Start-Sleep -s 5
}
}

 

template05

 

Le mot de passe du compte admin du domaine est demandé à l’utilisateur. 
L’étape suivante concerne l’installation d’une base de données ou non. Le script demande si une base de données est à installer et si oui de quelle version. Selon la réponse de l’utilisateur, un fichier .reg est exécuté afin de lancer un script d’installation de la base au prochain reboot : 

 

echo « r"
Write-host "######################### INSTALLER BASE DE DONNEES ##############################" -foregroundcolor "Yellow"
echo "
r »

Do {
$BDDOK = Read-Host ‘Base de données à installer ? (Répondre « y » ou « n »)’
$BDDOK = $BDDOK.ToLowerInvariant()
} While (($BDDOK -ne « y ») -and ($BDDOK -ne « n »))

If ($BDDOK -eq « y ») {
Do {
$version = Read-Host ‘2008 ou 2012 ? (Répondre « 2008 » ou « 2012 »)’
} While (($version -ne « 2008 ») -and ($version -ne « 2012 »))

Do {
$version2 = Read-Host ‘standard ou enterprise? (Répondre « s » ou « e »)’
} While (($version2 -ne « s ») -and ($version2 -ne « e »))

If ($version -eq « 2008 »){
Remove-Item -Recurse -Force « C:\Install-SQL\2012 »
If ($version2 -eq « s »){
regedit.exe /s « C:\Install-SQL\2008\Standard\sql2008standard.reg »
}Else {
regedit.exe /s « C:\Install-SQL\2008\Enterprise\sql2008enterprise.reg »
}
}Else {
Remove-Item -Recurse -Force « C:\Install-SQL\2008 »
If ($version2 -eq « s »){
regedit.exe /s « C:\Install-SQL\2012\Standard\sql2012standard.reg »
}Else {
regedit.exe /s « C:\Install-SQL\2012\Enterprise\sql2012enterprise.reg »
}
}
}Else{
Remove-Item -Recurse -Force « C:\Install-SQL »
}

 

template01

 

Pour la suite de l’installation de la base de données voir l’article ici.

Une fois l’exécution du fichier Configuration.ps1 terminé, les deux scripts exécutés dans la guest customization sont les suivants :

 

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command « Remove-Item -Recurse -Force C:\Premier-Boot

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command « Restart-Computer

 

Le premier permet de nettoyer le template des différentes scritps de configuration et le dernier permet de rebooter le serveur après la mise dans le domaine et afin de lancer l’éventuelle installation de la base de données au prochain boot.

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> 


*