define nspawn::machine ( String $template, String $machine = $name, Boolean $enable = false, String $machine_dir = $nspawn::machine_dir, Hash $nspawn_opts = {}, ) { require ::nspawn::setup # TODO # gather fact from 'machinectl list-images', and check if one with # our name + '.base' exists $domain = $facts['domain'] $root = "${machine_dir}/${machine}" # Copies image to us # TODO does this actually do anything more than a deep copy? exec { "Create ${machine} from template": command => [ 'systemd-nspawn', "--template=/var/lib/machines/${template}.base", '--quiet', '-D', $machine, '/bin/true', # run some command so we don't get stuck on boot prompt ], path => ['/bin','/usr/bin'], cwd => $machine_dir, creates => "${machine_dir}/${machine}", } file { "/var/lib/machines/${machine}/etc/hostname": ensure => file, content => "${machine}.${domain}\n", require => Exec["Create ${machine} from template"], } # systemd-nspawn --quiet -M debby systemctl enable puppet $nspawn_data = { 'Exec' => { # 'Hostname' => "${machine}.${domain}", 'Boot' => 'true', 'ResolvConf' => 'copy-static', # /usr/lib/systemd/resolv.conf }, 'Network' => { 'Bridge' => 'br0', } # TODO deep merge? } + $nspawn_opts file { "/etc/systemd/nspawn/${machine}.nspawn": ensure => file, content => epp('nspawn/unit_file.epp', { data => $nspawn_data, }), notify => Service["systemd-nspawn@${machine}.service"], } service { "systemd-nspawn@${machine}.service": enable => $enable, require => File["/etc/systemd/nspawn/${machine}.nspawn"], } }