define virtual::kvm::kvmx::instance( $vg, $size, $ram, $shell, $iface, $ip, $gateway, $guest_domain = 'example.org', $dns = 'host', $netmask = '255.255.255.0', $initial_user = 'user', $udev = false, $supervise = '1', $ssh_custom_pubkey = '', ) { virtual::kvm::instance { $name: udev => $udev, iface => $iface, shell => $shell ? { undef => '/usr/local/bin/kvmx-restricted-shell', default => $shell, }, } exec { "kvmx-lvcreate-${name}": command => "/sbin/lvcreate --name ${name} --size ${size} ${vg}", user => root, creates => "/dev/${vg}/${name}", #onlyif => "test ! -e /dev/${vg}/${name}" require => Virtual::Kvm::Instance["$name"], # due to udev rule } exec { "kvmx-init-${name}": command => "/usr/local/bin/kvmx init", user => $name, environment => [ "HOME=/home/${name}" ], cwd => "/home/${name}/vms/${name}", creates => "/home/${name}/vms/${name}/kvmxfile", require => Virtual::Kvm::Instance["$name"], } virtual::kvm::kvmx::config { "${name}-user": vm => $name, param => 'user', value => $initial_user, } virtual::kvm::kvmx::config { "${name}-memory": vm => $name, param => 'memory', value => $ram, } virtual::kvm::kvmx::config { "${name}-size": vm => $name, param => 'size', value => $size, } virtual::kvm::kvmx::config { "${name}-image": vm => $name, param => 'image', value => "\$HOME/vms/${name}/box.img", } virtual::kvm::kvmx::config { "${name}-net": vm => $name, param => 'net', value => "tap", } virtual::kvm::kvmx::config { "${name}-net_ip": vm => $name, param => 'net_ip', value => "$ip", } virtual::kvm::kvmx::config { "${name}-net_mask": vm => $name, param => 'net_mask', value => "$netmask", } virtual::kvm::kvmx::config { "${name}-net_gateway": vm => $name, param => 'net_gateway', value => "$gateway", } virtual::kvm::kvmx::config { "${name}-net_dns": vm => $name, param => 'net_dns', value => "$dns", } virtual::kvm::kvmx::config { "${name}-domain": vm => $name, param => 'domain', value => "$guest_domain", } virtual::kvm::kvmx::config { "${name}-spice": vm => $name, param => 'spice', value => "0", } virtual::kvm::kvmx::config { "${name}-run_spice_client": vm => $name, param => 'run_spice_client', value => "0", } virtual::kvm::kvmx::config { "${name}-graphics": vm => $name, param => 'graphics', value => "-nographic", } virtual::kvm::kvmx::config { "${name}-sound": vm => $name, param => 'sound', value => "0", } virtual::kvm::kvmx::config_unset { "${name}-shared_folder": vm => $name, param => 'shared_folder', } virtual::kvm::kvmx::config { "${name}-format": vm => $name, param => 'format', value => "raw", } virtual::kvm::kvmx::config { "${name}-image_type": vm => $name, param => 'image_type', value => "device", } virtual::kvm::kvmx::config { "${name}-ssh_support": vm => $name, param => 'ssh_support', value => "n", } virtual::kvm::kvmx::config { "${name}-drive_interface": vm => $name, param => 'drive_interface', value => "virtio,cache=none,index=0,format=raw", } virtual::kvm::kvmx::config { "${name}-supervise_manage": vm => $name, param => 'supervise_manage', value => "${supervise}", } if $ssh_custom_pubkey == '' { virtual::kvm::kvmx::config_unset { "${name}-ssh_custom_pubkey": vm => $name, param => 'ssh_custom_pubkey', } } else { virtual::kvm::kvmx::config { "${name}-ssh-custom_pubkey": vm => $name, param => 'ssh_custom_pubkey', value => $ssh_custom_pubkey, } } }