diff --git a/.fixtures.yml b/.fixtures.yml index c32c285..bfedcc1 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -1,8 +1,10 @@ fixtures: forge_modules: - stdlib: + stdlib: repo: "puppetlabs/stdlib" - epel: + epel: repo: "stahnma/epel" + concat: + repo: "puppetlabs/concat" symlinks: "rsnapshot": "#{source_dir}" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bf2add --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.bundle +Gemfile.lock +pkg/ +vendor/ diff --git a/.travis.yml b/.travis.yml index c4307e1..5690ddc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ script: "bundle exec rake validate && bundle exec rake spec SPEC_OPTS='--format matrix: fast_finish: true include: + rvm: 2.1 env: PUPPET_GEM_VERSION="~> 4.0" notifications: email: false + diff --git a/Gemfile b/Gemfile index 5ce94b0..8221837 100644 --- a/Gemfile +++ b/Gemfile @@ -5,3 +5,4 @@ gem 'puppet', puppetversion gem 'puppetlabs_spec_helper', '>= 0.8.2' gem 'puppet-lint', '>= 1.0.0' gem 'facter', '>= 1.7.0' +gem 'metadata-json-lint' diff --git a/README.md b/README.md index ac6b9fb..cc0eb5c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# rsnapshot +[![Build Status](https://travis-ci.org/loomsen/puppet-rsnapshot.svg?branch=master)](https://travis-ci.org/loomsen/puppet-rsnapshot) -## NOTE: ! Configuration for backup_scripts changed with version 0.4.0 (it was pretty useless in prior versions) ! +# rsnapshot #### Table of Contents @@ -205,41 +205,20 @@ Takes an Integer, a String or an Array as input, and returns a random entry from The following parameters are available in the `::rsnapshot` class: -#### `$hosts` -Hash containing the hosts to be backed up and optional overrides per host -(Default: undef (do nothing when no host given)) -#### `$conf_d` -The place where the configs will be dropped -(Default: /etc/rsnapshot (will be created if it doesn't exist)) -#### `$backup_user` -The user to run the backup scripts as -(Default: root, also the user used for ssh connections, if you change this make sure you have proper key deployed and the user exists in the nodes to be backed up.) -#### `$package_name` -(Default: rsnapshot) -#### `$package_ensure` -(Default: present) -#### `$cron_dir` -Directory to drop the cron files to. Crons will be created per host. -(Default: /etc/cron.d) -#### `$backup_levels` -Array containing the backup levels (hourly, daily, weekly, monthly) -Configure the backup_levels (valid per host and global, so you may either set: rsnapshot::backup_levels for all hosts or override default backup_levels for specific hosts) -(Default: [ 'daily', 'weekly', ] ) #### `$backup_defaults` Boolean. Backup default backup dirs or not. (Default: true) -#### `$default_backup` -The default backup directories. This will apply to all hosts unless you set [backup_defaults](#backup_defaults) = false -Default is: - -```puppet - $default_backup = { - '/etc' => './', - '/home' => './', - } -``` - +#### `$backup_levels` +Array containing the backup levels (hourly, daily, weekly, monthly) +Configure the backup_levels (valid per host and global, so you may either set: rsnapshot::backup_levels for all hosts or override default backup_levels for specific hosts) +(Default: [ 'daily', 'weekly', ] ) +#### `$backup_user` +The user to run the backup scripts as +(Default: root, also the user used for ssh connections, if you change this make sure you have proper key deployed and the user exists in the nodes to be backed up.) +#### `$conf_d` +The place where the configs will be dropped +(Default: /etc/rsnapshot (will be created if it doesn't exist)) #### `$cron` Hash. Set time ranges for different backup levels. Each item (minute, hour...) allows for cron notation, an array to pick a random time from and a range to pick a random time from. The range notation is '$start..$end', so to pick a random hour from 8 pm to 2 am, you could set the hour of your desired backup level to @@ -354,6 +333,44 @@ Default is: } ``` +#### `$cron_dir` +Directory to drop the cron files to. Crons will be created per host. +(Default: /etc/cron.d) +#### `$default_backup` +The default backup directories. This will apply to all hosts unless you set [backup_defaults](#backup_defaults) = false +Default is: + +```puppet + $default_backup = { + '/etc' => './', + '/home' => './', + } +``` +#### `$cronfile_prefix_use` +Bool. Set this to true if you want your cronfiles to have a prefix. +(Default: false) +#### `$cronfile_prefix` +Optional prefix to add to the cronfiles name. Your files will be named: prefix_hostname +(Default: 'rsnapshot_' only if you set $cronfile_prefix_use = true) +#### `$hosts` +Hash containing the hosts to be backed up and optional overrides per host +(Default: undef (do nothing when no host given)) +#### `$interval` +How many backups of each level to keep. +Default is: + +```puppet + $interval = { + 'daily' => '7', + 'weekly' => '4', + 'monthly' => '6', + } +``` + +#### `$package_ensure` +(Default: present) +#### `$package_name` +(Default: rsnapshot) #### `$snapshot_root` global. the directory holding your backups. (Default: /backup) @@ -377,18 +394,6 @@ You will end up with a structure like: └── weekly.0 ``` -#### `$interval` -How many backups of each level to keep. -Default is: - -```puppet - $interval = { - 'daily' => '7', - 'weekly' => '4', - 'monthly' => '6', - } -``` - #### `$backup_scripts` Additional scripts to create, possible values are: mysql, psql, misc diff --git a/manifests/config.pp b/manifests/config.pp index 702765f..e5237c2 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -2,8 +2,8 @@ # # manage host configs class rsnapshot::config ( - $hosts = $rsnapshot::hosts, - $cron_dir = $rsnapshot::cron_dir, + $hosts = $rsnapshot::hosts, + $cron_dir = $rsnapshot::cron_dir, ) { # these are global settings, no point in setting them per host @@ -12,6 +12,8 @@ class rsnapshot::config ( $conf_d = pick($rsnapshot::conf_d, $rsnapshot::params::conf_d, '/etc/rsnapshot') $snapshot_root = pick($hosts['snapshot_root'], $rsnapshot::snapshot_root, '/backup') $logpath = pick($rsnapshot::logpath, $rsnapshot::params::config_logpath) + $cronfile_prefix_use = pick($rsnapshot::cronfile_prefix_use, $rsnapshot::params::cronfile_prefix_use, false) + $cronfile_prefix = pick($rsnapshot::cronfile_prefix, $rsnapshot::params::cronfile_prefix, '') # make sure lock path and conf path exist file { $conf_d: ensure => 'directory', @@ -31,7 +33,7 @@ class rsnapshot::config ( # custom function, if only a hostname is given as a param, this is an empty hash # the next loop would break as puppet does not allow to reassign variables - # the function checks $hosts for elements like: + # the function checks $hosts for elements like: # { foo => } and converts those to { foo => {} } $hosts_clean = assert_empty_hash($hosts) @@ -135,7 +137,7 @@ class rsnapshot::config ( content => template('rsnapshot/rsnapshot.erb'), } - + if has_key($hash, backup_scripts) { $hash[backup_scripts].each |$script, $scriptconf| { @@ -158,17 +160,37 @@ class rsnapshot::config ( content => template("rsnapshot/${script}.sh.erb"), mode => '0755', } - + + } + } + + if $cronfile_prefix_use { + $rsnapshot_prefix = $rsnapshot::cronfile_prefix + } else { + $rsnapshot_prefix = '' + } + + # cron on Debian seems to ignore files that have dots in their name; replace + # them with underscores (issue #2) + case $::osfamily { + 'Debian': { + $cron_name = regsubst($host, '\.', '_', 'G') + $cronfile = "${cron_dir}/${rsnapshot_prefix}${cron_name}" + } + 'RedHat': { + $cronfile = "${cron_dir}/${rsnapshot_prefix}${host}" + } + default: { + $cronfile = "${cron_dir}/${rsnapshot_prefix}${host}" } } - $cronfile = "${cron_dir}/${host}" concat { $cronfile: } # create cron files for each backup level # merge possible cron definitions to one $real_cron = deep_merge($rsnapshot::params::cron, $rsnapshot::cron, $hash[cron]) - concat::fragment { "mailto for $host": + concat::fragment { "mailto for ${host}": content => "#This file is managed by puppet\nMAILTO=${real_cron[mailto]}\n\n", target => $cronfile, order => 1, @@ -190,4 +212,3 @@ class rsnapshot::config ( } } } - diff --git a/manifests/init.pp b/manifests/init.pp index 46bb154..f586bcc 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -5,20 +5,24 @@ # === Parameters # class rsnapshot ( - $hosts = $rsnapshot::params::hosts, - $conf_d = $rsnapshot::params::conf_d, - $logpath = $rsnapshot::params::config_logpath, - $lockpath = $rsnapshot::params::config_lockpath, - $default_backup = $rsnapshot::params::config_default_backup, - $package_name = $rsnapshot::params::package_name, - $package_ensure = $rsnapshot::params::package_ensure, - $cron = $rsnapshot::params::cron, - $backup_scripts = $rsnapshot::params::backup_scripts, - $include = $rsnapshot::params::config_include, - $exclude = $rsnapshot::params::config_exclude, - $snapshot_root = $rsnapshot::params::config_snapshot_root, - $backup_levels = $rsnapshot::params::config_backup_levels, - $cron_service_name = $rsnapshot::params::cron_service_name, + $hosts = $rsnapshot::params::hosts, + $conf_d = $rsnapshot::params::conf_d, + $logpath = $rsnapshot::params::config_logpath, + $lockpath = $rsnapshot::params::config_lockpath, + $default_backup = $rsnapshot::params::config_default_backup, + $package_name = $rsnapshot::params::package_name, + $package_ensure = $rsnapshot::params::package_ensure, + $cron = $rsnapshot::params::cron, + $backup_scripts = $rsnapshot::params::backup_scripts, + $include = $rsnapshot::params::config_include, + $exclude = $rsnapshot::params::config_exclude, + $snapshot_root = $rsnapshot::params::config_snapshot_root, + $backup_levels = $rsnapshot::params::config_backup_levels, + $cron_service_name = $rsnapshot::params::cron_service_name, + $cronfile_prefix = $rsnapshot::params::config_cronfile_prefix, + $cronfile_prefix_use = $rsnapshot::params::config_cronfile_prefix_use, + $check_mk_job = $rsnapshot::params::config_check_mk_job, + ) inherits rsnapshot::params { $default_backup_scripts = $rsnapshot::params::backup_scripts + $backup_scripts @@ -32,4 +36,3 @@ class rsnapshot ( contain '::rsnapshot::service' } } - diff --git a/manifests/params.pp b/manifests/params.pp index 3cff43b..aa483a3 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -16,6 +16,7 @@ class rsnapshot::params { $config_backup_levels = [ 'daily', 'weekly', 'monthly' ] $config_backup_defaults = true $config_version = '1.2' + $config_check_mk_job = false $config_cmd_cp = '/bin/cp' $config_cmd_rm = '/bin/rm' $config_cmd_rsync = '/usr/bin/rsync' @@ -25,6 +26,8 @@ class rsnapshot::params { $config_cmd_rsnapshot_diff = '/usr/bin/rsnapshot-diff' $config_cmd_preexec = undef $config_cmd_postexec = undef + $config_cronfile_prefix = 'rsnapshot_' + $config_cronfile_prefix_use = false $config_use_lvm = undef $config_linux_lvm_cmd_lvcreate = undef # '/sbin/lvcreate' $config_linux_lvm_cmd_lvremove = undef # '/sbin/lvremove' @@ -43,7 +46,7 @@ class rsnapshot::params { $config_loglevel = '4' $config_stop_on_stale_lockfile = undef # bool $config_rsync_short_args = '-az' - $config_rsync_long_args = undef # defaults are --delete --numeric-ids --relative --delete-excluded + $config_rsync_long_args = undef # defaults are --delete --numeric-ids --relative --delete-excluded $config_ssh_args = undef $config_du_args = undef $config_one_fs = undef @@ -124,6 +127,6 @@ class rsnapshot::params { ], default => [], }, - } + }, } } diff --git a/metadata.json b/metadata.json index 3f5be50..4531f50 100644 --- a/metadata.json +++ b/metadata.json @@ -12,13 +12,10 @@ "backup", "rsync" ], - "requirements": [ - { "name": "pe", "version_requirement": ">= 4.0.0" }, - { "name": "puppet", "version_requirement": ">= 4.0.0" } - ], "dependencies": [ - { "name": "puppetlabs-stdlib","version_range": ">= 1.0.0" }, - { "name": "stahnma-epel","version_range": ">= 1.0.0" } + { "name": "puppetlabs-stdlib","version_requirement": ">= 1.0.0" }, + { "name": "stahnma-epel","version_requirement": ">= 1.0.0" }, + { "name": "puppetlabs-concat","version_requirement": ">= 2.0.0 < 3.0.0" } ], "operatingsystem_support": [ { diff --git a/spec/classes/init_spec.rb b/spec/classes/init_spec.rb index 05d37a9..417fdbc 100644 --- a/spec/classes/init_spec.rb +++ b/spec/classes/init_spec.rb @@ -1,5 +1,7 @@ require 'spec_helper' describe 'rsnapshot' do + let(:facts) {{ :osfamily => 'RedHat' }} + it { should contain_class('rsnapshot::params') } it { is_expected.to compile } end diff --git a/templates/cron.erb b/templates/cron.erb index 4c63a80..56ae348 100644 --- a/templates/cron.erb +++ b/templates/cron.erb @@ -1 +1 @@ -<%= @minute %> <%= @hour %> <%= @monthday %> <%= @month %> <%= @weekday %> root /usr/bin/rsnapshot -c <%= @config %> <%= @level %> +<%= @minute %> <%= @hour %> <%= @monthday %> <%= @month %> <%= @weekday %> root<% if scope['rsnapshot::check_mk_job'] == true -%> mk-job rsnapshot_<%= @host %>_<%= @level %><% end -%> /usr/bin/rsnapshot -c <%= @config %> <%= @level %> diff --git a/templates/misc.sh.erb b/templates/misc.sh.erb index 15c9520..7185cc2 100644 --- a/templates/misc.sh.erb +++ b/templates/misc.sh.erb @@ -2,6 +2,6 @@ #This file is managed by puppet # <%@commands.each do |command| -%> -ssh -l <%=@backup_user-%> <%=@host-%> <%=command-%> +ssh -l <%=@backup_user-%> <%=@host-%> '<%=command-%>' <%end-%> diff --git a/templates/mysql.sh.erb b/templates/mysql.sh.erb index 210e51f..000212b 100644 --- a/templates/mysql.sh.erb +++ b/templates/mysql.sh.erb @@ -16,7 +16,7 @@ dbs=( ) <%end-%> for db in "${dbs[@]}"; do -<% if (@dbbackup_user == 'root' && @dbbackup_password = '' )-%> +<% if (@dbbackup_user == 'root' && @dbbackup_password == '' )-%> ssh -l <%=@backup_user-%> "$host" "<%=@dumper-%> <%=@dump_flags-%> ${db}" > "$db".sql <%else-%> ssh -l <%=@backup_user-%> "$host" "<%=@dumper-%> --user=<%=@dbbackup_user-%> --password='<%=@dbbackup_password-%>' <%=@dump_flags-%> ${db}" > "$db".sql