OVH Community, votre nouvel espace communautaire.

[sdk] Deploiment de VMs (Linux)


legor
30/06/2016, 16h34
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).

LoicD
25/04/2016, 15h50
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, 14h31
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.

sbouli
09/07/2013, 16h16
Bonjour,

Un moyen de modifier le script de clonage pour pouvoir imposer une mac address statique au clone ?

Stéphane

tarasik
01/10/2012, 19h35
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, 17h19
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 ?

tarasik
29/09/2012, 09h46
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, 14h47
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.

tarasik
22/09/2012, 10h56
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, 12h03
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

hpppv2
26/07/2012, 00h00
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

sbouli
10/04/2012, 22h40
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, 17h52
Tu veux run le script une seule fois ou à chaque démarrage ?

sbouli
29/03/2012, 17h52
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

sbouli
29/03/2012, 11h10
Citation 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

sbouli
28/03/2012, 19h14
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, 19h06
Salut,

En effet, il faut se connecter au vCenter

http://forum.ovh.net/showthread.php?t=73887

sbouli
28/03/2012, 16h39
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, 10h20
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,