Suite à des contraintes pour le déploiement de VM VDI chez un client :
- IP Fixe pour les VMs
- Uniquement des contrôleur de domaine Read-Only sur le réseau de production des VM
Il m’a fallut trouver une solution pour automatiser au maximum le déploiement des VMs.
L’idée est de déployer les VMs dans une VLAN de « Pré Déploiement » où la VM pourra joindre un contrôleur de domaine standard afin de s’enregistrer dans celui-ci et obtenant une IP via un serveur DHCP.
Puis de lancer un scripte qui à partir d’un fichier .csv liste les caractéristiques des VM (ip, subnet, gateway, dns) en faisant une comparaison entre le nom de la VM et le nom renseigné dans le fichier va paramétrer ces informations dans la VM, opérer un changement de VLAN pour déplacer la VM sur le réseau de production et enfin redémarrer la VM pour être que tout les agents se réenregistre avec la bonne IP.
Mon fichier .csv est donc de la sorte :
vmname,ipaddress,subnet,gateway,pdns,sdns,pgtgt
xpusvm01,192.168.100.1,255.255.255.0,192.168.100.254,192.168.100.10,192.168.100.11,dvPG_Target
xpfrvm02,192.168.100.2,255.255.255.0,192.168.100.254,192.168.100.10,192.168.100.11,dvPG_Target
xpvm03,192.168.100.3,255.255.255.0,192.168.100.254,192.168.100.10,192.168.100.11,dvPG_Target
et voici le scripte :
function LoadSnapin{
param($PSSnapinName)
if (!(Get-PSSnapin | where {$_.Name -eq $PSSnapinName})){
Add-pssnapin -name $PSSnapinName
}
}
LoadSnapin -PSSnapinName "VMware.VimAutomation.Core"
# Populating static variables
$vcserver = "vcenter"
$vc_user = "administrator"
$vc_userpwd = "password"
$csvpath = "d:\scripts\listvm.csv"
$prefix = ""
$pgdeploy = ""
# Using variables
# Connect-VIServer $vcserver -User $vc_user -Password $vc_userpwd
# Using current credential
Connect-VIServer $vcserver
# Get VMs present in the deployement portgroup and using a specific prefix
$vm = Get-VM -Name $prefix* | ? { $_ | Get-NetworkAdapter | Where { $_.NetworkName -eq $pgdeploy } }
# Ask for VM guest credentials
$GuestCred = $Host.UI.PromptForCredential("Please enter credentials", "Enter Guest credentials", "", "")
# Import CSV file containing ALL VM
$vmlist = Import-CSV $csvpath
foreach ($virtualMachine in $vm) {
$item = $vmlist | Where {$_.vmname -eq $virtualMachine.name}
# Setting variables
$vmname = $item.vmname
$ipaddr = $item.ipaddress
$subnet = $item.subnet
$gateway = $item.gateway
$pdns = $item.pdns
$sdns = $item.sdns
$portgrouptarget = $item.pgtgt
#Get the current interface info
$GuestInterface = Get-VMGuestNetworkInterface -VM $virtualMachine -GuestCredential $GuestCred
Set-VMGuestNetworkInterface -VMGuestNetworkInterface $GuestInterface -GuestCredential $GuestCred -IP $item.ipaddress -Netmask $item.subnet -Gateway $item.gateway -DNS $item.pdns,$item.sdns
# Moving deployed VM to production portgroup
Get-VM -Name $prefix* | Get-NetworkAdapter | Where { $_.NetworkName -eq $pgdeploy } | Set-NetworkAdapter -NetworkName $portgrouptarget -Confirm:$false
# Restarting VM
Restart-VMGuest -VM $item.vmname -Confirm:$false
}