diff options
Diffstat (limited to 'puppet/modules/backupninja/manifests')
| -rw-r--r-- | puppet/modules/backupninja/manifests/cron.pp | 17 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/duplicity.pp | 147 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/generate_sshkey.pp | 33 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/init.pp | 52 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/key.pp | 41 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/labelmount.pp | 62 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/maildir.pp | 43 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/mysql.pp | 38 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/nagios_plugin/duplicity.pp | 45 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/pgsql.pp | 27 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/rdiff.pp | 109 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/rsync.pp | 128 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/server.pp | 147 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/sh.pp | 25 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/svn.pp | 28 | ||||
| -rw-r--r-- | puppet/modules/backupninja/manifests/sys.pp | 45 | 
16 files changed, 987 insertions, 0 deletions
| diff --git a/puppet/modules/backupninja/manifests/cron.pp b/puppet/modules/backupninja/manifests/cron.pp new file mode 100644 index 00000000..bd4e857c --- /dev/null +++ b/puppet/modules/backupninja/manifests/cron.pp @@ -0,0 +1,17 @@ +# Write the backupninja cron job, allowing you to specify an alternate backupninja +# command (if you want to wrap it in any other commands, e.g. to allow it to use +# the monkeysphere for authentication), or a different schedule to run it on. +define backupninja::cron( +  $backupninja_cmd = '/usr/sbin/backupninja', +  $backupninja_test_cmd = $backupninja_cmd, +  $cronfile = "/etc/cron.d/backupninja", +  $min = "0", $hour = "*", $dom = "*", $month = "*", +  $dow = "*") +{ +  file { $cronfile: +    content => template('backupninja/backupninja.cron.erb'), +    owner => root, +    group => root, +    mode => 0644 +  } +} diff --git a/puppet/modules/backupninja/manifests/duplicity.pp b/puppet/modules/backupninja/manifests/duplicity.pp new file mode 100644 index 00000000..a05da876 --- /dev/null +++ b/puppet/modules/backupninja/manifests/duplicity.pp @@ -0,0 +1,147 @@ +# Run duplicity-backup as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: +# +#      The prefix to give to the handler config filename, to set order in +#      which the actions are executed during the backup run. +# +#   ensure: +# +#      Allows you to delete an entry if you don't want it any more (but be +#      sure to keep the configdir, name, and order the same, so that we can +#      find the correct file to remove). +# +#   options, nicelevel, testconnect, tmpdir, sign, encryptkey, signkey, +#   password, include, exclude, vsinclude, incremental, keep, bandwidthlimit, +#   sshoptions, destdir, desthost, desuser: +# +#      As defined in the backupninja documentation.  The options will be +#      placed in the correct sections automatically.  The include and +#      exclude options should be given as arrays if you want to specify +#      multiple directories. +# +#   directory, ssh_dir_manage, ssh_dir, authorized_keys_file, installuser, +#   installkey, backuptag: +# +#      Options for the bakupninja::server::sandbox define, check that +#      definition for more info. +# +# Some notes about this handler: +# +#   - When specifying a password, be sure to enclose it in single quotes, +#     this is particularly important if you have any special characters, such +#     as a $ which puppet will attempt to interpret resulting in a different +#     password placed in the file than you expect! +#   - There's no support for a 'local' type in backupninja's duplicity +#     handler on version 0.9.6-4, which is the version available in stable and +#     testing debian repositories by the time of this writing. +define backupninja::duplicity( $order  = 90, +                               $ensure = present, +                               # options to the config file +                               $options     = false, +                               $nicelevel   = false, +                               $testconnect = false, +                               $tmpdir      = false, +                               # [gpg] +                               $sign       = false, +                               $encryptkey = false, +                               $signkey    = false, +                               $password   = false, +                               # [source] +                               $include = [ "/var/spool/cron/crontabs", +                                            "/var/backups", +                                            "/etc", +                                            "/root", +                                            "/home", +                                            "/usr/local/*bin", +                                            "/var/lib/dpkg/status*" ], +                               $exclude = [ "/home/*/.gnupg", +                                            "/home/*/.local/share/Trash", +                                            "/home/*/.Trash", +                                            "/home/*/.thumbnails", +                                            "/home/*/.beagle", +                                            "/home/*/.aMule", +                                            "/home/*/.gnupg", +                                            "/home/*/.gpg", +                                            "/home/*/.ssh", +                                            "/home/*/gtk-gnutella-downloads", +                                            "/etc/ssh/*" ], +                               $vsinclude = false, +                               # [dest] +                               $incremental   = "yes", +                               $increments   = false, +                               $keep          = false, +                               $keepincroffulls = false, +                               $bandwidthlimit = false, +                               $sshoptions    = false, +                               $destdir       = false, +                               $desthost      = false, +                               $destuser      = false, +                               $desturl       = false, +                               # configs to backupninja client +                               $backupkeystore       = $backupninja::keystore, +                               $backupkeystorefspath = $backupninja::keystorefspath, +                               $backupkeytype        = $backupninja::keytype, +                               $backupkeydest        = $backupninja::keydest, +                               $backupkeydestname    = $backupninja::keydestname, +                               # options to backupninja server sandbox +                               $ssh_dir_manage       = true, +                               $ssh_dir              = "${destdir}/.ssh", +                               $authorized_keys_file = 'authorized_keys', +                               $installuser          = true, +                               $backuptag            = "backupninja-${::fqdn}", +                               # key options +                               $createkey            = false, +                               $keymanage            = $backupninja::keymanage ) { + +  # install client dependencies +  ensure_resource('package', 'duplicity', {'ensure' => $backupninja::ensure_duplicity_version}) + +  case $desthost { false: { err("need to define a destination host for remote backups!") } } +  case $destdir { false: { err("need to define a destination directory for remote backups!") } } +  case $password { false: { err("a password is necessary either to unlock the GPG key, or for symmetric encryption!") } } + +  # guarantees there's a configured backup space for this backup +  backupninja::server::sandbox { "${user}-${name}": +    user                 => $destuser, +    host                 => $desthost, +    dir                  => $destdir, +    manage_ssh_dir       => $ssh_dir_manage, +    ssh_dir              => $ssh_dir, +    authorized_keys_file => $authorized_keys_file, +    installuser          => $installuser, +    backuptag            => $backuptag, +    backupkeys           => $backupkeystore, +    keytype              => $backupkeytype, +  } + +  # the client's ssh key +  backupninja::key { "${destuser}-${name}": +    user           => $destuser, +    createkey      => $createkey, +    keymanage      => $keymanage, +    keytype        => $backupkeytype, +    keystore       => $backupkeystore, +    keystorefspath => $backupkeystorefspath, +    keydest        => $backupkeydest, +    keydestname    => $backupkeydestname +  } + +  # the backupninja rule for this duplicity backup +  file { "${backupninja::configdir}/${order}_${name}.dup": +    ensure  => $ensure, +    content => template('backupninja/dup.conf.erb'), +    owner   => root, +    group   => root, +    mode    => 0600, +    require => File["${backupninja::configdir}"] +  } + +  if $backupninja::manage_nagios { +    nagios::service::passive { $nagios_description: } +  } + +} + diff --git a/puppet/modules/backupninja/manifests/generate_sshkey.pp b/puppet/modules/backupninja/manifests/generate_sshkey.pp new file mode 100644 index 00000000..a3008e50 --- /dev/null +++ b/puppet/modules/backupninja/manifests/generate_sshkey.pp @@ -0,0 +1,33 @@ +define backupninja::generate_sshkey( +  $ssh_key_basepath = '/etc/puppet/modules/keys/files/backupkeys', +){ + +  # generate backupninja ssh keypair +  $ssh_key_name = "backup_${::hostname}_id_rsa" +  $ssh_keys = ssh_keygen("${ssh_key_basepath}/${ssh_key_name}") +  $public = split($ssh_keys[1],' ') +  $public_type = $public[0] +  $public_key = $public[1] + +  file { '/root/.ssh': +    ensure => directory, +    owner  => 'root', +    group  => 'root', +    mode   => '0600'; +  } + +  # install ssh keypair on client +  file { "/root/.ssh/$ssh_key_name": +    content => $ssh_keys[0], +    owner   => root, +    group   => 0, +    mode    => '0600'; +  } + +  file { "/root/.ssh/$ssh_key_name.pub": +    content => $public_key, +    owner   => root, +    group   => 0, +    mode    => '0666'; +  } +} diff --git a/puppet/modules/backupninja/manifests/init.pp b/puppet/modules/backupninja/manifests/init.pp new file mode 100644 index 00000000..e453e703 --- /dev/null +++ b/puppet/modules/backupninja/manifests/init.pp @@ -0,0 +1,52 @@ +# configure backupninja +class backupninja ( +  $ensure_backupninja_version = 'installed', +  $ensure_rsync_version = 'installed', +  $ensure_rdiffbackup_version = 'installed', +  $ensure_debconfutils_version = 'installed', +  $ensure_hwinfo_version = 'installed', +  $ensure_duplicity_version = 'installed', +  $configdir = '/etc/backup.d', +  $keystore = "${::fileserver}/keys/backupkeys", +  $keystorefspath = false, +  $keytype = 'rsa', +  $keydest = '/root/.ssh', +  $keyowner = 0, +  $keygroup = 0, +  $keymanage = true, +  $configfile = '/etc/backupninja.conf', +  $loglvl = 4, +  $when = 'everyday at 01:00', +  $reportemail = 'root', +  $reportsuccess = false, +  $reportwarning = true, +  $reporthost = undef, +  $reportuser = undef, +  $reportdirectory = undef, +  $logfile = '/var/log/backupninja.log', +  $scriptdir = '/usr/share/backupninja', +  $libdir = '/usr/lib/backupninja', +  $usecolors = true, +  $vservers = false, +  $manage_nagios = false, +) { + +  # install client dependencies +  ensure_resource('package', 'backupninja', {'ensure' => $ensure_backupninja_version}) + +  # set up backupninja config directory +  file { $configdir: +    ensure => directory, +    mode   => '0750', +    owner  => 0, +    group  => 0; +  } + +  file { $configfile: +    content => template('backupninja/backupninja.conf.erb'), +    owner   => root, +    group   => 0, +    mode    => '0644' +  } + +} diff --git a/puppet/modules/backupninja/manifests/key.pp b/puppet/modules/backupninja/manifests/key.pp new file mode 100644 index 00000000..9d34cdbd --- /dev/null +++ b/puppet/modules/backupninja/manifests/key.pp @@ -0,0 +1,41 @@ +# generate and deploy backupninja sshkeys +define backupninja::key( +  $user = $name, +  $createkey = false, +  $keymanage = $backupninja::keymanage, +  $keyowner = $backupninja::keyowner, +  $keygroup = $backupninja::keygroup, +  $keystore= $backupninja::keystore, +  $keystorefspath = $backupninja::keystorefspath, +  $keytype = $backupninja::keytype, +  $keydest = $backupninja::keydest, +  $keydestname = "id_${backupninja::keytype}" ) +{ + +  # generate the key +  if $createkey == true { +    if $keystorefspath == false { +      err('need to define a destination directory for sshkey creation!') +    } +    $ssh_keys = ssh_keygen("${keystorefspath}/${keydestname}") +  } + +  # deploy/manage the key +  if $keymanage == true { +    $keydestfile = "${keydest}/${keydestname}" +    ensure_resource('file', $keydest, { +      'ensure' => 'directory', +      'mode'   => '0700', +      'owner'  => $keyowner, +      'group'  => $keygroup +    }) +    ensure_resource('file', $keydestfile, { +      'ensure'  => 'present', +      'source'  => "${keystore}/${user}_id_${keytype}", +      'mode'    => '0700', +      'owner'   => $keyowner, +      'group'   => $keygroup, +      'require' => File[$keydest], +    }) +  } +} diff --git a/puppet/modules/backupninja/manifests/labelmount.pp b/puppet/modules/backupninja/manifests/labelmount.pp new file mode 100644 index 00000000..8974cec1 --- /dev/null +++ b/puppet/modules/backupninja/manifests/labelmount.pp @@ -0,0 +1,62 @@ +# Mount a labelled partition on a directory as part of a backupninja run. +# +# This type will automatically create an unmount action with an order of 99 +# for the destination directory you specify here. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run.  Note +#      that the value given here should be less than any action which +#      requires the filesystem to be mounted! +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#   label: The partition label to mount. +# +#   dest: The directory to mount the partition onto. +#  +define backupninja::labelmount($order = 10, +                               $ensure = present, +                               $label, +                               $dest +                              ) { +	file { "${backupninja::configdir}/${order}_${name}.labelmount": +		ensure => $ensure, +		content => template('backupninja/labelmount.conf.erb'), +		owner => root, +		group => root, +		mode => 0600, +		require => File["${backupninja::configdir}"] +	} + +	file { "${backupninja::configdir}/99_${name}.umount": +		ensure => $ensure, +		content => template('backupninja/umount.conf.erb'), +		owner => root, +		group => root, +		mode => 0600, +		require => File["${backupninja::configdir}"] +	} +	 +	# Copy over the handler scripts themselves, since they're not in the +	# standard distribution, and are unlikely to end up there any time +	# soon because backupninja's "build" system is balls. +	file { "/usr/share/backupninja/labelmount": +		content => template('backupninja/labelmount.handler'), +		owner => root, +		group => root, +		mode => 0755, +		require => Package[backupninja] +	} + +	file { "/usr/share/backupninja/umount": +		content => template('backupninja/umount.handler'), +		owner => root, +		group => root, +		mode => 0755, +		require => Package[backupninja] +	} +} diff --git a/puppet/modules/backupninja/manifests/maildir.pp b/puppet/modules/backupninja/manifests/maildir.pp new file mode 100644 index 00000000..2454b82d --- /dev/null +++ b/puppet/modules/backupninja/manifests/maildir.pp @@ -0,0 +1,43 @@ +# maildir handler, as part of a backupninja run. +# +# The maildir handler slowly creates a backup of each user's +# maildir to a remote server. It is designed to be run with +# low overhead in terms of CPU and bandwidth, so it runs pretty +# slow. Hardlinking is used to save storage space. The actual +# maildir is stored within each snapshot directory. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#  +define backupninja::maildir( +  $order = 99, $ensure = present, +  $when = 'everyday at 21:00', $srcdir = false, +  $destdir = false, $desthost = false, $destuser = false, $destid_file = false, +  $remove = false, $multiconnection = yes, $keepdaily='4', $keepweekly='2', +  $keepmonthly='2') +{ +  # install client dependencies +  ensure_resource('package', 'rsync', {'ensure' => $backupninja::ensure_rsync_version}) + +  case $srcdir { false: { err("need to define a source directory to backup!") } } +  case $destdir { false: { err("need to define a destination directory to backup!") } } +  case $desthost { false: { err("need to define a destination host for backups!") } } +  case $destuser { false: { err("need to define a destination user for backups!") } } +  case $destid_file { false: { err("need to define a ssh key id file to use!") } } +   +  file { "${backupninja::configdir}/${order}_${name}.maildir": +    ensure => $ensure, +    content => template('backupninja/maildir.conf.erb'), +    owner => root, +    group => root, +    mode => 0600, +    require => File["${backupninja::configdir}"] +  } +} diff --git a/puppet/modules/backupninja/manifests/mysql.pp b/puppet/modules/backupninja/manifests/mysql.pp new file mode 100644 index 00000000..b8877c05 --- /dev/null +++ b/puppet/modules/backupninja/manifests/mysql.pp @@ -0,0 +1,38 @@ +# Safe MySQL dumps, as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#   user, dbusername, dbpassword, dbhost, databases, backupdir, +#   hotcopy, sqldump, compress, configfile: As defined in the +#   backupninja documentation, with the caveat that hotcopy, sqldump, +#   and compress take true/false rather than yes/no. +#  +define backupninja::mysql( +  $order = 10, $ensure = present, $user = false, $dbusername = false, $dbpassword = false, +  $dbhost = 'localhost', $databases = 'all', $backupdir = false, $hotcopy = false, +  $sqldump = false, $compress = false, $configfile = true, +  $vsname = false, $sqldumpoptions = '--lock-tables --complete-insert --add-drop-table --quick --quote-names', +  $nodata = false) +{ +   +  $real_configfile = $configfile ? { +    true => "/etc/mysql/debian.cnf", +    default => $configfile, +  } + +  file { "${backupninja::configdir}/${order}_${name}.mysql": +    ensure => $ensure, +    content => template('backupninja/mysql.conf.erb'), +    owner => root, +    group => root, +    mode => 0600, +    require => File["${backupninja::configdir}"] +  } +} diff --git a/puppet/modules/backupninja/manifests/nagios_plugin/duplicity.pp b/puppet/modules/backupninja/manifests/nagios_plugin/duplicity.pp new file mode 100644 index 00000000..7dbd2633 --- /dev/null +++ b/puppet/modules/backupninja/manifests/nagios_plugin/duplicity.pp @@ -0,0 +1,45 @@ +class backupninja::nagios_plugin::duplicity { +  case $::operatingsystem { +    'Debian': { package { 'python-argparse': ensure => installed, } } +    'Ubuntu': { package { 'python-argh':     ensure => installed, } } +    default:  { +      notify {'Backupninja-Duplicity Nagios check needs python-argparse to be installed !':}  } +  } + +  file { '/usr/lib/nagios/plugins/check_backupninja_duplicity.py': +    source => 'puppet:///modules/backupninja/nagios_plugins/duplicity/check_backupninja_duplicity.py', +    mode   => '0755', +    owner  => 'nagios', +    group  => 'nagios', +  } + +  # deploy helper script +  file { '/usr/lib/nagios/plugins/backupninja_duplicity_freshness.sh': +    source => 'puppet:///modules/backupninja/nagios_plugins/duplicity/backupninja_duplicity_freshness.sh', +    mode   => '0755', +    owner  => 'nagios', +    group  => 'nagios', +  } + +  nagios::nrpe::command { 'check_backupninja_duplicity': +    command_line => "sudo ${::nagios::nrpe::nagios_plugin_dir}/check_backupninja_duplicity.py" +  } +  sudo::spec {'nrpe_check_backupninja_duplicity': +      ensure    => present, +      users     => 'nagios', +      hosts     => 'ALL', +      commands  => "NOPASSWD: ${::nagios::nrpe::nagios_plugin_dir}/check_backupninja_duplicity.py"; +  } + +  nagios::service { "Backupninja Duplicity $::fqdn": +    use_nrpe              => true, +    check_command         => 'check_backupninja_duplicity', +    nrpe_timeout          => '60', +    # check only twice a day +    normal_check_interval => '720', +    # recheck every hour +    retry_check_interval  => '60', +  } + + +} diff --git a/puppet/modules/backupninja/manifests/pgsql.pp b/puppet/modules/backupninja/manifests/pgsql.pp new file mode 100644 index 00000000..d4814be9 --- /dev/null +++ b/puppet/modules/backupninja/manifests/pgsql.pp @@ -0,0 +1,27 @@ +# Safe PGSQL dumps, as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#   backupdir, compress, configfile: As defined in the +#   backupninja documentation, with the caveat that hotcopy, sqldump, +#   and compress take true/false rather than yes/no. +#  +define backupninja::pgsql( +  $order = 10, $ensure = present, $databases = 'all', $backupdir = "/var/backups/postgres", $compress = true, $vsname = false) +{ +  file { "${backupninja::configdir}/${order}_${name}.pgsql": +    ensure => $ensure, +    content => template('backupninja/pgsql.conf.erb'), +    owner => root, +    group => root, +    mode => 0600, +    require => File["${backupninja::configdir}"] +  } +} diff --git a/puppet/modules/backupninja/manifests/rdiff.pp b/puppet/modules/backupninja/manifests/rdiff.pp new file mode 100644 index 00000000..cd73d22c --- /dev/null +++ b/puppet/modules/backupninja/manifests/rdiff.pp @@ -0,0 +1,109 @@ +# Run rdiff-backup as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#   keep, include, exclude, type, host, directory, user, sshoptions: As +#      defined in the backupninja documentation.  The options will be placed +#      in the correct sections automatically.  The include and exclude +#      options should be given as arrays if you want to specify multiple +#      directories. +#  +define backupninja::rdiff( $order  = 90, +                           $ensure = present, +                           # [general] +                           $options = '--force', +                           $extras  = false, +                           # [source] +                           $include = [ "/var/spool/cron/crontabs", +                                        "/var/backups", +                                        "/etc", +                                        "/root", +                                        "/home", +                                        "/usr/local/*bin", +                                        "/var/lib/dpkg/status*" +                                      ], +                           $exclude = [ "/home/*/.gnupg", +                                        "/home/*/.local/share/Trash", +                                        "/home/*/.Trash", +                                        "/home/*/.thumbnails", +                                        "/home/*/.beagle", +                                        "/home/*/.aMule", +                                        "/home/*/gtk-gnutella-downloads" +                                      ], +                           $vsinclude = false, +                           # [dest] +                           $type       = 'local', +                           $host       = false, +                           $user       = false, +                           $home       = "/home/${user}-${name}", +                           $keep       = 30, +                           $sshoptions = false, +                           # ssh keypair config +                           $key            = false, +                           $keymanage      = $backupninja::keymanage, +                           $backupkeystore = $backupninja::keystore, +                           $backupkeytype  = $backupninja::keytype, +                           $ssh_dir_manage = true, +                           $ssh_dir        = "${home}/.ssh", +                           $authorized_keys_file = 'authorized_keys', +                           # sandbox config +                           $installuser = true, +                           $backuptag   = "backupninja-${::fqdn}", +                           # monitoring +                           $nagios_description = "backups-${name}" ) { + +  # install client dependencies +  ensure_resource('package', 'rdiff-backup', {'ensure' => $backupninja::ensure_rdiffbackup_version}) + +  $directory = "$home/$name/" + +  case $type { +    'remote': { +      case $host { false: { err("need to define a host for remote backups!") } } + +      backupninja::server::sandbox { "${user}-${name}": +        user                 => $user, +        host                 => $host, +        dir                  => $home, +        manage_ssh_dir       => $ssh_dir_manage, +        ssh_dir              => $ssh_dir, +        key                  => $key, +        authorized_keys_file => $authorized_keys_file, +        installuser          => $installuser, +        backuptag            => $backuptag, +        backupkeys           => $backupkeystore, +        keytype              => $backupkeytype, +      } +      +      backupninja::key { "${user}-${name}": +        user      => $user, +        keymanage => $keymanage, +        keytype   => $backupkeytype, +        keystore  => $backupkeystore, +      } +    } +  } + + +  file { "${backupninja::configdir}/${order}_${name}.rdiff": +    ensure  => $ensure, +    content => template('backupninja/rdiff.conf.erb'), +    owner   => root, +    group   => root, +    mode    => 0600, +    require => File["${backupninja::configdir}"] +  } + +  if $backupninja::manage_nagios { +    nagios::service::passive { $nagios_description: } +  } + +} +   diff --git a/puppet/modules/backupninja/manifests/rsync.pp b/puppet/modules/backupninja/manifests/rsync.pp new file mode 100644 index 00000000..fc59950b --- /dev/null +++ b/puppet/modules/backupninja/manifests/rsync.pp @@ -0,0 +1,128 @@ +# Run rsync as part of a backupninja run. +# Based on backupninja::rdiff + +define backupninja::rsync( $order  = 90, +                           $ensure = present, +                           # [general] +                           $log             = false, +                           $partition       = false, +                           $fscheck         = false, +                           $read_only       = false, +                           $mountpoint      = false, +                           $format          = false, +                           $days            = false, +                           $keepdaily       = false, +                           $keepweekly      = false, +                           $keepmonthly     = false, +                           $lockfile        = false, +                           $nicelevel       = 0, +                           $tmp             = false, +                           $multiconnection = false, +                           $enable_mv_timestamp_bug = false, +                           # [source] +                           $include = [ "/var/spool/cron/crontabs", +                                        "/var/backups", +                                        "/etc", +                                        "/root", +                                        "/home", +                                        "/usr/local/*bin", +                                        "/var/lib/dpkg/status*" +                                      ], +                           $exclude = [ "/home/*/.gnupg", +                                        "/home/*/.local/share/Trash", +                                        "/home/*/.Trash", +                                        "/home/*/.thumbnails", +                                        "/home/*/.beagle", +                                        "/home/*/.aMule", +                                        "/home/*/gtk-gnutella-downloads" +                                      ], +                           # [dest] +                           $host           = false, +                           $user           = false, +                           $home           = "/home/${user}-${name}", +                           $subfolder      = 'rsync', +                           $testconnect    = false, +                           $ssh            = false, +                           $protocol       = false, +                           $numericids     = false, +                           $compress       = false, +                           $port           = false, +                           $bandwidthlimit = false, +                           $remote_rsync   = false, +                           $batch          = false, +                           $batchbase      = false, +                           $fakesuper      = false, +                           $id_file        = false, +                           # [services] +                           $initscripts = false, +                           $service     = false, +                           # [system] +                           $rm    = false, +                           $cp    = false, +                           $touch = false, +                           $mv    = false, +                           $fsck  = false, +                           # ssh keypair config +                           $key                  = false, +                           $keymanage            = $backupninja::keymanage, +                           $backupkeystore       = $backupninja::keystore, +                           $backupkeytype        = $backupninja::keytype, +                           $ssh_dir_manage       = true, +                           $ssh_dir              = "${home}/.ssh", +                           $authorized_keys_file = 'authorized_keys', +                           # sandbox config +                           $installuser = true, +                           $backuptag   = "backupninja-${::fqdn}", +                           # monitoring +                           $nagios_description = "backups-${name}" ) { + +  # install client dependencies +  ensure_resource('package', 'rsync', {'ensure' => $backupninja::ensure_rsync_version}) + +  # Right now just local origin with remote destination is supported. +  $from = 'local' +  $dest = 'remote' + +  case $dest { +    'remote': { +      case $host { false: { err("need to define a host for remote backups!") } } + +      $directory = "${home}/${subfolder}/" + +      backupninja::server::sandbox { "${user}-${name}": +        user                 => $user, +        host                 => $host, +        dir                  => $home, +        manage_ssh_dir       => $ssh_dir_manage, +        ssh_dir              => $ssh_dir, +        key                  => $key, +        authorized_keys_file => $authorized_keys_file, +        installuser          => $installuser, +        backuptag            => $backuptag, +        keytype              => $backupkeytype, +        backupkeys           => $backupkeystore, +      } +      +      backupninja::key { "${user}-${name}": +        user       => $user, +        keymanage  => $keymanage, +        keytype    => $backupkeytype, +        keystore   => $backupkeystore, +      } +    } +  } + +  file { "${backupninja::configdir}/${order}_${name}.rsync": +    ensure  => $ensure, +    content => template('backupninja/rsync.conf.erb'), +    owner   => root, +    group   => root, +    mode    => 0600, +    require => File["${backupninja::configdir}"] +  } + +  if $backupninja::manage_nagios { +    nagios::service::passive { $nagios_description: } +  } + +} diff --git a/puppet/modules/backupninja/manifests/server.pp b/puppet/modules/backupninja/manifests/server.pp new file mode 100644 index 00000000..49e42a0f --- /dev/null +++ b/puppet/modules/backupninja/manifests/server.pp @@ -0,0 +1,147 @@ +# this define realizes all needed resources for a hosted backup +define backupninja_server_realize($host) { +  User               <<| tag == "backupninja-$host" |>> +  File               <<| tag == "backupninja-$host" |>> +  Ssh_authorized_key <<| tag == "backupninja-$host" |>> +} + +class backupninja::server ( +  $backupdir = '/backup', +  $backupdir_ensure = 'directory', +  $manage_nagios = false, +  $nagios_server = undef, +  $nagios_warn_level = 129600, +  $nagios_crit_level = 216000, +) { + +  group { "backupninjas": +    ensure => "present", +    gid => 700 +  } +   +  file { $backupdir: +    ensure => $backupdir_ensure, +    mode => 0710, owner => root, group => "backupninjas", +    require => $backupdir_ensure ? { +      'directory' => undef, +      default     => File["$backupdir_ensure"], +    } +  } + +  if $manage_nagios { + +    case $nagios_server { undef: { err('Cannot manage nagios without nagios_server parameter!') } } + +    include nagios::nsca::client +     +    file { "/usr/local/bin/checkbackups": +      ensure => "present", +      source => "puppet:///modules/backupninja/checkbackups.pl", +      mode => 0755, owner => root, group => root, +    } + +    cron { checkbackups: +      command => "/usr/local/bin/checkbackups -d ${backupdir} -s ${nagios_server} -w ${nagios_warn_level} -c ${nagios_crit_level} | grep -v 'sent to host successfully'", +      user => "root", +      hour => "8-23", +      minute => 59, +      require => [ File["/usr/local/bin/checkbackups"], Package['nsca'] ] +    } +  } + +  # collect all resources from hosted backups +  Backupninja_server_realize <<| tag == $::fqdn |>> + +  # this define allows nodes to declare a remote backup sandbox, that have to +  # get created on the server +  define sandbox ( +    $user = $name, +    $host = $::fqdn, +    $installuser = true, +    $dir, +    $manage_ssh_dir = true, +    $ssh_dir = "${dir}/.ssh", +    $authorized_keys_file = 'authorized_keys', +    $key = false, +    $keytype = 'dss', +    $backupkeys = "${fileserver}/keys/backupkeys", +    $uid = false, +    $gid = "backupninjas", +    $backuptag = "backupninja-${::fqdn}", +  ) { + +    if !defined(Backupninja_server_realize["${::fqdn}@${host}"]) { +      @@backupninja_server_realize { "${::fqdn}@${host}": +        host => $::fqdn, +        tag  => $host, +      } +    } + +    if !defined(File["$dir"]) { +      @@file { "$dir": +        ensure => directory, +        mode => 0750, owner => $user, group => 0, +        tag => "$backuptag", +      } +    } + +    if $installuser { + +       if $manage_ssh_dir { +        if !defined(File["$ssh_dir"]) { +          @@file { "${ssh_dir}": +            ensure => directory, +            mode => 0700, owner => $user, group => 0, +            require => [User[$user], File["$dir"]], +            tag => "$backuptag", +          } +         } +       }  + +      if $key { +        # $key contais ssh public key +        if !defined(Ssh_autorized_key["$user"]) { +          @@ssh_authorized_key{ "$user": +            type    => $keytype, +            key     => $key, +            user    => $user, +            target  => "${ssh_dir}/${authorized_keys_file}", +            tag     => "$backuptag", +            require => User[$user], +          } +        } +      } +      else { +        # get ssh public key exists from server +        if !defined(File["${ssh_dir}/${authorized_keys_file}"]) { +          @@file { "${ssh_dir}/${authorized_keys_file}": +            ensure => present, +            mode => 0644, owner => 0, group => 0, +            source => "${backupkeys}/${user}_id_${keytype}.pub", +            require => File["${ssh_dir}"], +            tag => "$backuptag", +          } +        } +      } +       +      if !defined(User["$user"]) { +        @@user { "$user": +          ensure   => "present", +          uid      => $uid ? { +              false   => undef, +              default => $uid +          }, +          gid      => "$gid", +          comment  => "$user backup sandbox", +          home     => "$dir", +          managehome => true, +          shell    => "/bin/bash", +          password => '*', +          require  => Group['backupninjas'], +          tag      => "$backuptag" +        } +      } +    } +  } +} + diff --git a/puppet/modules/backupninja/manifests/sh.pp b/puppet/modules/backupninja/manifests/sh.pp new file mode 100644 index 00000000..4a60e5fa --- /dev/null +++ b/puppet/modules/backupninja/manifests/sh.pp @@ -0,0 +1,25 @@ +# sh handler, as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#  +define backupninja::sh($order = 50, +                           $ensure = present, +                           $command_string +                          ) { +	file { "${backupninja::configdir}/${order}_${name}.sh": +		ensure => $ensure, +		content => template('backupninja/sh.conf.erb'), +		owner => root, +		group => root, +		mode => 0600, +		require => File["${backupninja::configdir}"] +	} +} diff --git a/puppet/modules/backupninja/manifests/svn.pp b/puppet/modules/backupninja/manifests/svn.pp new file mode 100644 index 00000000..1ab0597f --- /dev/null +++ b/puppet/modules/backupninja/manifests/svn.pp @@ -0,0 +1,28 @@ +# Subversion dumps, as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#  +define backupninja::svn($order = 20, +                           $ensure = present, +                           $src = '/var/lib/svn', +                           $dest = '/var/backups/svn', +                           $tmp = '/var/backups/svn.tmp', +                           $vsname = false +                          ) { +	file { "${backupninja::configdir}/${order}_${name}.svn": +		ensure => $ensure, +		content => template('backupninja/svn.conf.erb'), +		owner => root, +		group => root, +		mode => 0600, +		require => File["${backupninja::configdir}"] +	} +} diff --git a/puppet/modules/backupninja/manifests/sys.pp b/puppet/modules/backupninja/manifests/sys.pp new file mode 100644 index 00000000..946a525e --- /dev/null +++ b/puppet/modules/backupninja/manifests/sys.pp @@ -0,0 +1,45 @@ +# sys handler, as part of a backupninja run. +# +# Valid attributes for this type are: +# +#   order: The prefix to give to the handler config filename, to set +#      order in which the actions are executed during the backup run. +# +#   ensure: Allows you to delete an entry if you don't want it any more +#      (but be sure to keep the configdir, name, and order the same, so +#      that we can find the correct file to remove). +# +#  +define backupninja::sys($order = 30, +                           $ensure = present, +                           $parentdir = '/var/backups', +                           $packages = true, +                           $packagesfile = '/var/backups/dpkg-selections.txt', +                           $partitions = true, +                           $partitionsfile = '/var/backups/partitions.__star__.txt', +                           $dosfdisk = true, +                           $hardware = true, +                           $hardwarefile = '/var/backups/hardware.txt', +                           $dohwinfo = true, +                           $doluks = false, +                           $dolvm = false +                          ) { + +  # install client dependencies +  case $operatingsystem { +    debian,ubuntu: { +      ensure_resource('package', 'debconf-utils', {'ensure' => $backupninja::ensure_debconfutils_version}) +      ensure_resource('package', 'hwinfo', {'ensure' => $backupninja::ensure_hwinfo_version}) +    } +    default: {} +  } + +	file { "${backupninja::configdir}/${order}_${name}.sys": +		ensure => $ensure, +		content => template('backupninja/sys.conf.erb'), +		owner => root, +		group => root, +		mode => 0600, +		require => File["${backupninja::configdir}"] +	} +} | 
