[sdk] Deploiment de VMs (Linux)
Merci François pour ces explications bien utiles pour l'automatisation du déploiement de machines virtuelles !
Est-ce que quelqu'un aurait une piste pour personnaliser la clé publique de l'utilisateur de la machine virtuelle ? L'idée serait de pouvoir écrire un script ayant une clé publique en paramètre, capable de créer une machine virtuelle ayant le réseau configuré et à laquelle on pourrait ensuite se connecter avec cette clé publique.
A l'heure actuelle je procède en deux temps (déploiement de la machine virtuelle à partir d'un modèle ayant des paramètres d'authentification par défaut, puis modification des paramètres d'authentification juste après la création de la machine virtuelle).
Suite à la demande sur la ml, voici comment déployer un template en modifiant le portGroup de destination :
Code:
my $portgroup = 'LAN5001';
my $PortGroupView = Vim::find_entity_view(
'view_type' => 'DistributedVirtualPortgroup',
'filter' => { 'name' => $portgroup },
);
if(not $PortGroupView)
{
print Dumper('Failed to get network view');
Util::disconnect();
exit;
}
my $portgroupKey = $PortGroupView->key;
my $dvsKey = $PortGroupView->config->distributedVirtualSwitch;
my $DvsView = Vim::get_view(
'mo_ref' => $dvsKey,
);
if(not $DvsView)
{
print Dumper('Failed to get DVS view');
Util::disconnect();
exit;
}
my $networkAdapterKey;
foreach my $device (@{$VMView->config->hardware->device})
{
if(ref $device eq 'VirtualE1000')
{
$networkAdapterKey = $device->key;
}
}
if(not $networkAdapterKey)
{
print "No network card on this template";
Util::disconnect();
exit;
}
my $dvsUuid = $DvsView->uuid;
my $DistributedVirtualSwitchPortConnection = DistributedVirtualSwitchPortConnection->new(
'portgroupKey' => $portgroupKey,
'switchUuid' => $dvsUuid,
);
my $VirtualEthernetCardDistributedVirtualPortBackingInfo = VirtualEthernetCardDistributedVirtualPortBackingInfo->new(
'port' => $DistributedVirtualSwitchPortConnection,
);
my $VirtualDeviceConnectInfo = VirtualDeviceConnectInfo->new(
'connected' => '1',
'startConnected' => '1',
'allowGuestControl' => '1',
);
my $VirtualE1000 = VirtualE1000->new(
'key' => $networkAdapterKey,
'backing' => $VirtualEthernetCardDistributedVirtualPortBackingInfo,
'connectable' => $VirtualDeviceConnectInfo,
);
my $VirtualDeviceConfigSpec = VirtualDeviceConfigSpec->new(
'operation' => VirtualDeviceConfigSpecOperation->new('edit'),
'device' => $VirtualE1000,
);
my $VirtualMachineConfigSpec = VirtualMachineConfigSpec->new(
'deviceChange' => [$VirtualDeviceConfigSpec],
);
Bien sur à adapter en fonction du nom de votre portGroup et à ajouter au script de déploiement de template de Francois.
m0numentum
10/03/2016, 13h31
Bonjour à tous.
J'ai un petit problème sur la configuration IP de la machine clonée. En effet, je clone un template que je déploie en lui appliquant quelques petits changements (nombres de VCPUs et quantité de RAM et ajout d'un disque). Tout se passe bien sauf pour la configuration IP. Je fais exactement la même chose que dans le script que tu proposes François et pourtant, au démarrage, ma machine n'a pas l'adresse IP que je lui fournie, ni le nom que je veux pour le hostname.
Du coup je ne sais pas ce qui cloche et j'espèrerais recevoir un peu d'aide ^^'.
Merci par avance.
Bonjour,
Un moyen de modifier le script de clonage pour pouvoir imposer une mac address statique au clone ?
Stéphane
J'ai testé à nouveau et je te confirme que ma machine source perd le réseau au premier boot (clone + configuration wizard). Je vais donc désactiver la carte réseau manuellement en attendant de trouver un contournement, j'imagine que l'on peut également scripter celà ?
floiseau
01/10/2012, 16h19
En théorie, lors du premier boot de la VM, le customization wizard décoche le réseau de la VM, applique la conf, reboot avec le réseau.
Pas de duplicata possible.
Ce n'est pas le snapshot pris pour le clone qui te poserait problème ?
Merci François, par contre au moment d’appliquer la customisation ma VM source perd le réseau car la machine cible boot une première fois pour effectuer la customisation donc duplicata d'adresse IP pendant 5 secondes :-(
floiseau
26/09/2012, 13h47
Bonjour,
Tu veux cloner, puis ensuite appliquer le customization ? Je veux dire, tu as une VM donnée, déjà existante et tu veux lui applique le custom wizard ?
Sinon tu peux appliquer le script de ce thread. Le clone de la VM et le déploiement du template sont des fonctions similaires.
Quelqu'un aurait il un script pour cloner une machine et appliquer une customisation, le but étant de cloner une machine de production tous les dimanches soir afin d'avoir un environnement de formation à jour tout les lundi matin ?
Merci de votre aide
floiseau
21/08/2012, 11h03
Salut,
La partie windows de la custom aurait cette forme :
Code:
my $CustomizationGlobalIPSettings = CustomizationGlobalIPSettings->new(
'dnsServerList' => [ '192.168.0.1' , '192.168.0.2' ],
'dnsSuffixList' => [ 'ton.domaine' ],
);
my $CustomizationUserData = CustomizationUserData->new(
'computerName' => 'Name',
'fullName' => 'Corp',
'orgName' => 'Corp',
'productId' => "",
);
my $CustomizationIdentification = CustomizationIdentification->new('joinWorkgroup' => 'WORKGROUP');
$CustomizationGuiUnattended = CustomizationGuiUnattended->new(
'autoLogon' => 'true',
'autoLogonCount' => 1,
'password' => CustomizationPassword->new(
'plainText' =>'true',
'value' => $password,
),
'timeZone' =>'105', # Paris (http://technet.microsoft.com/en-us/library/cc772783%28WS.10%29.aspx)
);
my $runOnce = [
'C:\test1.bat' ,
'c:\test2.bat,
];
my $CustomizationIdentitySettings = new CustomizationIdentitySettings;
$CustomizationIdentitySettings = CustomizationSysprep->new(
'guiRunOnce' => CustomizationGuiRunOnce->new( 'commandList' => $runOnce ),
'guiUnattended' => $CustomizationGuiUnattended,
'identification' => $CustomizationIdentification,
'userData' => $CustomizationUserData,
);
my $CustomizationIdentitySettings = CustomizationSysprep->new(
'guiRunOnce' => $CustomizationGuiRunOnce,
'guiUnattended' => $CustomizationGuiUnattended,
'licenseFilePrintData' => $CustomizationLicenseFilePrintData ,
'identification' => $CustomizationIdentification,
'userData' => $CustomizationUserData,
);
Pour le reste, la config de la VM reste la même chose
Auriez vous ce genre de script pour la Customisation des vm windows?
Genre le domaine, passe du compte admin, nom du pc, licence windows etc ...
Merci
Bonjour François,
non 1 seule fois, (sinon y'aurais cron), l'idée serais un de lancer un process fils qui attends le boot complet de la VM, puis lance un ssh avec le script ....
d'un autre côté, c'est désormais inutile, j'ai créé toutes mes VM puis fais un grosse boucle avec un ssh et lancé le script ....
Merci quand même ...
Stéphane
floiseau
10/04/2012, 16h52
Tu veux run le script une seule fois ou à chaque démarrage ?
encore moi ... désolé ...
est-il possible de faire executer (avec un paramètre) un script bash dans la VM après le boot power on (script déjà présent)
Stéphane

Envoyé par
sbouli
comme tu es là mon petit françois, comment puis-je spécifier le folder dans lequel créer la VM ? (je parle de rangement/organisation)
j'ai trouvé, pour ceux qui chercheraient :
Code:
# get folder
print "Getting Folder destination view\n";
my $FolderView = Vim::find_entity_view(
'view_type' => 'Folder',
'begin_entity' => $DatacenterView,
'filter' => { 'name' => $folder }
);
if (!$FolderView)
{
print Dumper('Repertoire destination $folder introuvable');
Util::disconnect();
exit;
}
puis
Code:
eval{$VMView->CloneVM(
'folder' => $FolderView,
'name' => $vmFullName,
'spec' => $VirtualMachineCloneSpec,
);};
c'est quand même pratique ...
Stéphane
comme tu es là mon petit françois, comment puis-je spécifier le folder dans lequel créer la VM ? (je parle de rangement/organisation)
Stéphane
floiseau
28/03/2012, 18h06
Salut,
En effet, il faut se connecter au vCenter
http://forum.ovh.net/showthread.php?t=73887
François ... si t'es au salon cloud machin ... j'ai un soucis avec ce script sur la ligne :
my $VMView = Vim::find_entity_view(
j'obtiens :
Vim::find_entity_view called, but no global session is defined at ./clone.sh line 31
j'ai beau googleit je vois pas ....
Laisse tomber, je suis un noob ... fallait juste se connecter au pCC
Stéphane
floiseau
27/12/2011, 09h20
Bonjour,
Ce post présente le moyen de déployer une VM linux à partir d'un template / d'une VM (clone) en utilisant le customization wizard.
On récupère dans un premier temps l'environnement de deploiement, on crée le customization script et ensuite on deploie la VM
Les déclarations :
Code:
my $templateName = 'debian5-64';
my $datacenterName = 'pcc-XXX-XXX-XXX-XXX_Datacenter1';
my $vmName = 'MyVM';
my $clusterName = 'Cluster1';
my $datastoreName = 'pcc-000218';
my $custTimezone = 'Europe/Paris';
my $domain = 'ovh.net';
my $dns = [ '213.186.33.99' ];
my $ip = '192.168.0.10';
my $netmask = '255.255.255.0';
my $gateway = '192.168.0.10';
On récupère l'environnement sur le vCenter
Code:
####
## Getting all views
#
# On récupère la view Datacenter
print "Getting Datacenter view \n";
my $DatacenterView = Vim::find_entity_view(
'view_type' => 'Datacenter',
'filter' => {
'name' => $datacenterName
}
);
!$DatacenterView and die('Failed to get DatacenterView');
print "Got Datacenter View\n";
# On récupère la view de la VM que l'on veut déployer (/le template)
print "Getting Template View\n";
my $VMView = Vim::find_entity_view(
'view_type' => 'VirtualMachine',
'filter' => {
'name' => $templateName
},
'begin_entity' => $DatacenterView,
);
if (!$VMView)
{
print Dumper('Failed to get Template view');
Util::disconnect();
exit;
}
# On get la view du cluster où l'on veut déployer notre VM
print "Getting Cluster destination view\n";
my $ClusterView = Vim::find_entity_view(
'view_type' => 'ClusterComputeResource',
'begin_entity' => $DatacenterView,
'filter' => { 'name' => $clusterName }
);
if (!$ClusterView)
{
print Dumper('Failed to get cluster view');
Util::disconnect();
exit;
}
# Enfin la view du datastore
print "Getting datastore destination view \n";
my $DatastoreView = Vim::find_entity_view(
'view_type' => 'Datastore',
'begin_entity' => $DatacenterView,
'filter' => {
'name' => $datastoreName
}
);
if (!$DatastoreView)
{
print Dumper('Failed to get datastore view');
Util::disconnect();
exit;
}
La partie de configuration de la VM de destination, qui comprend le customization wizard :
Code:
# Partie de configuration du reseau / hostname VM destination
my $CustomizationGlobalIPSettings;
my $custName = CustomizationFixedName->new( name => $vmName );
my $custDomain = $domain;
$CustomizationGlobalIPSettings = CustomizationGlobalIPSettings->new(
'dnsServerList' => $dns,
'dnsSuffixList' => [ $domain ],
);
my $custUtcClock = 'false';
my $CustomizationIdentitySettings = CustomizationLinuxPrep->new(
hostName => $custName,
domain => "$custDomain",
hwClockUTC => $custUtcClock,
timeZone => "$custTimezone",
);
my $CustIp = CustomizationFixedIp->new(
'ipAddress' => $ip
);
my $CustomizationIPSettings = CustomizationIPSettings->new(
'ip' => $CustIp,
'subnetMask' => $netmask,
'dnsServerList' => $dns,
'gateway' => [ $gateway ],
'dnsDomain' => $domain,
);
my $CustomizationAdapterMapping = CustomizationAdapterMapping->new(
'adapter' => $CustomizationIPSettings
);
# Partie de configuration "matérielle" de la VM destination
my $CustomizationSpec;
$CustomizationSpec = CustomizationSpec->new(
'globalIPSettings' => $CustomizationGlobalIPSettings,
'identity' => $CustomizationIdentitySettings,
'nicSettingMap' => [ $CustomizationAdapterMapping ],
);
my $VirtualMachineRelocateSpec = VirtualMachineRelocateSpec->new(
'datastore' => $DatastoreView,
'diskMoveType' => 'moveAllDiskBackingsAndAllowSharing',
'pool' => $ClusterView->resourcePool,
);
my $VirtualMachineConfigSpec = new VirtualMachineConfigSpec;
my $VirtualMachineCloneSpec = VirtualMachineCloneSpec->new(
'config' => $VirtualMachineConfigSpec,
'customization' => $CustomizationSpec,
'location' => $VirtualMachineRelocateSpec,
'powerOn' => 'true',
'template' => 'false'
);
Enfin, on peut déployer la VM :
Code:
print ('Let\'s clone');
eval{$VMView->CloneVM(
'folder' => $DatacenterView->vmFolder,
'name' => $vmName,
'spec' => $VirtualMachineCloneSpec,
);};
if($@)
{
my @report = ('Error crearting VM : ', $@);
print Dumper(@report);
Util::disconnect();
exit;
}
Merci,