NAME

Rex::Commands::Virtualization - Virtualization module

DESCRIPTION

With this module you can manage your virtualization.

Version <= 1.0: All these functions will not be reported.

All these functions are not idempotent.

SYNOPSIS

use Rex::Commands::Virtualization;

set virtualization => "LibVirt";
set virtualization => "VBox";

use Data::Dumper;

print Dumper vm list => "all";
print Dumper vm list => "running";

vm destroy => "vm01";

vm delete => "vm01";

vm start => "vm01";

vm shutdown => "vm01";

vm reboot => "vm01";

vm option => "vm01",
      max_memory => 1024*1024,
      memory    => 512*1024;

print Dumper vm info => "vm01";

# creating a vm on a kvm host
vm create => "vm01",
   storage    => [
     {
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "vda",
     }
   ];

print Dumper vm hypervisor => "capabilities";

EXPORTED FUNCTIONS

vm($action => $name, %option)

This module only exports the vm function. You can manage everything with this function.

EXAMPLES

Creating a Virtual Machine

Create a (VirtualBox) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, 10 GB in size being a file on disk. With a cdrom as an iso image and a natted network. The bootorder is set to "dvd".

vm create => "vm01",
   storage    => [
     {
       file  => "/mnt/data/vbox/vm01.img",
       size  => "10G",
     },
     {
       file => "/mnt/iso/debian6.iso",
     }
   ],
   memory => 512,
   type => "Linux26",
   cpus => 1,
   boot => "dvd";

Create a (KVM) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, 10 GB in size being a file on disk. With a cdrom as an iso image and a bridged network on the bridge virbr0. The Bootorder is set to "cdrom".

vm create => "vm01",
   boot => "cdrom",
   storage    => [
     {
       size  => "10G",
       file  => "/mnt/data/libvirt/images/vm01.img",
     },

     {
       file    => "/mnt/data/iso/debian-6.0.2.1-amd64-netinst.iso",
     },
   ];

This is the same as above, but with all options in use.

vm create => "vm01",
   memory  => 512*1024,
   cpus    => 1,
   arch    => "x86_64",
   boot    => "cdrom",
   clock   => "utc",
   emulator => "/usr/bin/qemu-system-x86_64",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       driver_type => "qcow2",      # supports all formats qemu-img supports.
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "vda",
       bus   => "virtio",
       address => {
         type    => "pci",
         domain  => "0x0000",
         bus    => "0x00",
         slot    => "0x05",
         function => "0x0",
       },
     },
     {  type    => "file",
       device  => "cdrom",
       file    => "/mnt/data/iso/debian-6.0.2.1-amd64-netinst.iso",
       dev    => "hdc",
       bus    => "ide",
       readonly => 1,
       address  => {
         type     => "drive",
         controller => 0,
         bus      => 1,
         unit     => 0,
       },
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
       model  => "virtio",
       address => {
         type    => "pci",
         domain  => "0x0000",
         bus    => "0x00",
         slot    => "0x03",
         function => "0x0",
       },
     },
   ],
   serial_devices => [
     {
       type => 'tcp',
       host => '127.0.0.1',
       port => 12345,
     },
   ];

Create a (Xen/HVM) VM named "vm01" with 512 MB ram and 1 cpu. One harddrive, cloned from an existing one.

vm create => "vm01",
   type  => "hvm",
   storage    => [
     {
       file    => "/mnt/data/libvirt/images/vm01.img",
       template => "/mnt/data/libvirt/images/svn01.img",
     },
   ];

This is the same as above, but with all options in use.

vm create => "vm01",
   memory => 512*1024,
   cpus  => 1,
   boot  => "hd",
   clock  => "utc",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/vm01.img",
       dev   => "hda",
       bus   => "ide",
       template => "/mnt/data/libvirt/images/svn01.img",
     },
     {  type    => "file",
       device  => "cdrom",
       dev    => "hdc",
       bus    => "ide",
       readonly => 1,
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
     },
   ],
   type => "hvm";

Create a (Xen/PVM) VM named "vm01" with 512 MB ram and 1 cpu. With one root partition (10GB in size) and one swap parition (1GB in size).

vm create => "vm01",
   type  => "pvm",
   storage    => [
     {
       file   => "/mnt/data/libvirt/images/domains/vm01/disk.img",
       dev    => "xvda2",
       is_root => 1,
     },
     {
       file  => "/mnt/data/libvirt/images/domains/vm01/swap.img",
       dev   => "xvda1",
     },
   ];

This is the same as above, but with all options in use.

vm create => "vm01",
   type  => "pvm",
   memory => 512*1024,
   cpus  => 1,
   clock  => "utc",
   on_poweroff => "destroy",
   on_reboot  => "restart",
   on_crash   => "restart",
   os       => {
     type  => "linux",
     kernel => "/boot/vmlinuz-2.6.32-5-xen-amd64",
     initrd => "/boot/initrd.img-2.6.32-5-xen-amd64",
     cmdline => "root=/dev/xvda2 ro",
   },
   storage    => [
     {  type  => "file",
       size  => "10G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/domains/vm01/disk.img",
       dev   => "xvda2",
       bus   => "xen",
       aio   => 1, # if you want to use aio
     },
     {  type  => "file",
       size  => "4G",
       device => "disk",
       file  => "/mnt/data/libvirt/images/domains/vm01/swap.img",
       dev   => "xvda1",
       bus   => "xen",
       aio   => 1, # if you want to use aio
     },
   ],
   network => [
     {  type   => "bridge",
       bridge  => "virbr0",
     },
   ];

Start/Stop/Destroy

Start a stopped vm

vm start => "name";

Stop a running vm (send shutdown signal)

vm shutdown => "name";

Hard Stop a running vm

vm destroy => "name";

Delete

vm delete => "name";

Modifying a VM

Currently you can only modify the memory.

vm option => "name",
     max_memory => 1024*1024, # in bytes
     memory    => 512*1024;

Request information of a vm

vm info => "name";

Request info from the underlying hypervisor

vm hypervisor => "capabilities";