1
0
mirror of https://github.com/krislamo/puppet-rsnapshot synced 2025-04-10 16:24:21 +00:00

Compare commits

...

131 Commits

Author SHA1 Message Date
512130b0d8
Bump version 2020-05-26 15:56:38 -04:00
f3cd595a8f
Add bool2num conversion for missing one_fs_num var 2020-05-21 16:05:23 -04:00
Administrator
03c31b78c2 Merge branch 'release/1.2.4'
* release/1.2.4:
  bump version
2018-04-16 17:39:49 +02:00
Administrator
679c742fd3 bump version 2018-04-16 17:39:47 +02:00
Administrator
9327c68d59 fix README, monthday cannot be 0 2018-04-16 17:36:26 +02:00
Norbert Varzariu
b72f1dfb36
Merge pull request #13 from hellp/patch-1
Fix: monthday in cronjob cannot be 0
2018-04-15 23:09:36 +02:00
Fabian Neumann
4820ededfa
Fix: monthday in cronjob cannot be 0
At least according to `man 5 cronjob` (and also Wikipedia ;) the day of month can only be 1-31. When the script created a cron.d file with a 0 at that position the script would not run at all.
2018-04-11 09:21:37 +02:00
Norbert Varzariu
c7e02c53dd Merge branch 'develop' 2017-04-24 20:46:46 +02:00
Norbert Varzariu
43cd819749 add test for tmpfiles.d dir 2017-04-24 20:46:04 +02:00
Norbert Varzariu
ab20bea159 Merge branch 'hotfix/create_tmpfiles_d' into develop 2017-04-24 20:44:18 +02:00
Norbert Varzariu
8aba7d0782 Merge branch 'hotfix/create_tmpfiles_d'
- create tmpfiles.d dir on hosts without systemd
2017-04-24 20:43:57 +02:00
Norbert Varzariu
a774e8b360 create /etc/tmpfiles.d dir on OS without systemd 2017-04-24 20:43:49 +02:00
Norbert Varzariu
02b61e2180 Merge branch 'release/1.2.2' into develop 2017-04-24 20:08:50 +02:00
Norbert Varzariu
063df85094 Merge branch 'release/1.2.2'
- fix issue#12: add /etc/tmpfiles.d/rsnapshot.conf to create run dir
  after reboot
2017-04-24 20:07:49 +02:00
Norbert Varzariu
765ed614b7 bump version 2017-04-24 20:07:43 +02:00
Norbert Varzariu
94b890df6d Merge branch 'feature/create_run_dir-issue#12' into develop
fix issue#12
2017-04-24 20:04:17 +02:00
Norbert Varzariu
a2dfd903c3 fix regex 2017-04-24 19:57:24 +02:00
Norbert Varzariu
3ae826a0e0 remove cron test, add file content match 2017-04-24 19:51:57 +02:00
Norbert Varzariu
efa6ef8808 add some tests 2017-04-24 19:42:31 +02:00
Norbert Varzariu
e1f5fa7ebe add tmpfiles.d config - issue#12 2017-04-24 19:25:16 +02:00
Norbert Varzariu
2590264764 Merge branch 'master' into develop 2017-04-24 18:57:57 +02:00
Norbert Varzariu
165bcd0766 Merge branch 'master' into develop 2017-04-24 18:56:39 +02:00
Norbert Varzariu
434afe708b Merge pull request #11 from martialblog/add_beaker
Add beaker test to module
2017-04-20 08:32:03 +02:00
Markus Opolka
395efceea9 Add beaker test to module 2017-04-19 22:55:18 +02:00
Norbert Varzariu
8f25dab414 Merge branch 'hotfix/1.2.1' into develop 2017-04-09 10:18:47 +02:00
Norbert Varzariu
4d810759ac Merge branch 'hotfix/1.2.1'
- fix link to contributors
2017-04-09 10:18:29 +02:00
Norbert Varzariu
090cf17370 bump version 2017-04-09 10:18:23 +02:00
Norbert Varzariu
1a68a16c79 Merge branch 'master' into develop 2017-04-09 10:16:14 +02:00
Norbert Varzariu
4124d18885 fix wrong link to list of contributors 2017-04-09 10:16:07 +02:00
Norbert Varzariu
8fb1b403e0 Merge branch 'release/1.2.0' into develop 2017-04-09 09:59:07 +02:00
Norbert Varzariu
e681cc959e Merge branch 'release/1.2.0'
- add option to unmanage cron
- fix undefined variables (when running puppet in strict mode)
2017-04-09 09:58:12 +02:00
Norbert Varzariu
9d42f4d0cd bump version 2017-04-09 09:58:04 +02:00
Norbert Varzariu
e999869e8c update docs 2017-04-09 09:55:54 +02:00
Norbert Varzariu
3089c49a66 Merge branch 'master' into develop 2017-04-09 09:55:29 +02:00
Norbert Varzariu
92a466d90a Merge pull request #10 from runejuhl/unmanage_cron
- Add option to unmanage cron
- Fix undefined vars (for running puppet in strict mode)
2017-04-09 09:41:55 +02:00
Rune Juhl Jacobsen
d2cf15621b Add option to avoid managing cron 2017-04-06 09:20:32 +02:00
Rune Juhl Jacobsen
450474165f Fix undefined variables 2017-04-06 09:19:17 +02:00
Norbert Varzariu
33f7031f2c Merge branch 'release/1.1.1' into develop 2017-04-02 10:55:15 +02:00
Norbert Varzariu
3821db2c4f Merge branch 'release/1.1.1' 2017-04-02 10:55:07 +02:00
Norbert Varzariu
d1a262800f bump version and bugfix 2017-04-02 10:54:52 +02:00
Norbert Varzariu
a78ccc1e43 Merge branch 'master' into develop 2017-04-02 10:46:35 +02:00
Administrator
6f92da8a17 add quotes to ssh command (misc script) 2017-04-02 10:45:25 +02:00
Administrator
a67dd7ea29 fix order of params 2017-04-02 10:40:07 +02:00
Norbert Varzariu
1be930d6cf Merge branch 'release/1.1.0' into develop 2017-04-02 10:20:36 +02:00
Norbert Varzariu
cbf6a3db52 Merge branch 'release/1.1.0'
- Feature: rsnapshot_prefix
- Feature: check_mk options
2017-04-02 10:19:52 +02:00
Norbert Varzariu
283ade9782 bump version 2017-04-02 10:19:18 +02:00
Norbert Varzariu
f92a8814ac Merge pull request #8 from loomsen/monotek-issue/2-cron_and_dots
Monotek issue/2 cron and dots
2017-04-02 10:10:59 +02:00
Administrator
85532a73b2 update readme 2017-04-02 09:24:14 +02:00
Administrator
87775af5c7 add prefix feature 2017-04-02 09:14:46 +02:00
Administrator
960b0090e4 try and fix travis build 2017-04-02 08:42:15 +02:00
Administrator
46c96d9b6c try and fix travis build 2017-04-02 08:40:45 +02:00
André Bauer
6e7d8e02f3 use prefix not by default 2017-04-01 23:27:18 +02:00
André Bauer
7dd4b98f1a fixed typo 2017-03-14 23:52:08 +01:00
André Bauer
5c35e8378b some fixes 2017-03-14 23:51:18 +01:00
Norbert Varzariu
c5de50bd71 Merge pull request #6 from monotek/check_mk_job
added check_mk mk-job support
2017-03-13 16:54:00 +01:00
André Bauer
9f0fdf0547 removed superfluous line 2017-02-27 12:00:54 +01:00
André Bauer
90ee92acb8 fix crontabs with dots on debian & added rsnapshot_prefix var 2017-02-27 11:58:18 +01:00
André Bauer
d7436ed582 added check_mk mk-job support 2017-02-27 09:49:59 +01:00
Norbert Varzariu
59cdc23ca1 add travis build status to readme 2017-02-07 18:08:10 +01:00
Norbert Varzariu
a394973d4a fix matrix build in travis.yml 2017-02-07 17:45:23 +01:00
Norbert Varzariu
a32ddcf208 remove jruby from travis.yml 2017-02-07 17:37:24 +01:00
Norbert Varzariu
7d39968e12 remove jruby from travis.yml 2017-02-07 17:37:02 +01:00
Norbert Varzariu
c6b7caefb7 add fixed ruby version to travis.yml 2017-02-07 17:33:01 +01:00
Norbert Varzariu
75e778ad9c Merge pull request #4 from jhoblitt/plumbing/concat-dep
missing dep on concat module
2016-12-21 22:19:45 +01:00
Norbert Varzariu
3dea0ba9e1 Merge pull request #3 from jhoblitt/plumbing/updates
plumbing updates to get tests working
2016-12-21 22:18:54 +01:00
Joshua Hoblitt
feb0898c01 add metadata-json-lint gem 2016-12-21 10:51:37 -07:00
Joshua Hoblitt
f6e32dd53b add missing dep on concat module 2016-12-21 10:51:37 -07:00
Joshua Hoblitt
cb04f5e70f add trivial .gitignore 2016-12-21 10:42:29 -07:00
Joshua Hoblitt
cf50ff6251 fix validation warning
Logic error
2016-12-21 10:36:49 -07:00
Joshua Hoblitt
decccb771f fix rspec tests
Missing ::osfamily fact.
2016-12-21 10:34:57 -07:00
Norbert Varzariu
1feea03aaa removed single quotes in misc script template 2016-06-27 13:21:03 +02:00
Norbert Varzariu
a37c7f71ea Merge branch 'release/1.0.3' into develop
- fix ordering of monthday and month in cron
2016-03-29 16:17:58 +02:00
Norbert Varzariu
f5003e3758 Merge branch 'release/1.0.3' 2016-03-29 16:17:43 +02:00
Norbert Varzariu
93be1c12ac bump version 2016-03-29 16:16:19 +02:00
Norbert Varzariu
ea87bf924a Merge pull request #1 from nerdlich/patch-1
Correct order of monthday/month
2016-03-28 13:36:54 +02:00
nerdlich
c79d1c7fc6 Correct order of monthday/month 2016-03-24 22:53:52 +01:00
Norbert Varzariu
98519a8ebc Merge branch 'develop' 2016-01-26 08:29:52 +01:00
Norbert Varzariu
a386a710b7 quote psql password in scripts 2016-01-26 08:29:42 +01:00
Norbert Varzariu
0c5afff356 Merge branch 'release/1.0.2' into develop 2016-01-25 09:48:38 +01:00
Norbert Varzariu
3c9357f3fe Merge branch 'release/1.0.2'
- Update README
2016-01-25 09:48:18 +01:00
Norbert Varzariu
0618f0fff3 bump verison to 1.0.2 2016-01-25 09:47:57 +01:00
Norbert Varzariu
5d82b82757 update README 2016-01-25 09:47:05 +01:00
Norbert Varzariu
0e80853628 Merge branch 'release/1.0.1' into develop 2016-01-25 09:41:26 +01:00
Norbert Varzariu
1fe21e5bba Merge branch 'release/1.0.1'
- small fixes to psql backup script
2016-01-25 09:41:03 +01:00
Norbert Varzariu
08cc0037b1 bump version to 1.0.1 2016-01-25 09:40:58 +01:00
Norbert Varzariu
b3ab06b63c add postgres to psql.ignore_dbs 2016-01-25 09:40:05 +01:00
Norbert Varzariu
d252ac64a0 move PGPASSWD variable into ssh command (so it is available on the node) 2016-01-25 08:56:04 +01:00
Norbert Varzariu
8dd6298c56 Merge branch 'master' into develop 2016-01-25 08:55:20 +01:00
Norbert Varzariu
343d12c61b Merge branch 'release/1.0.0' into develop 2016-01-22 16:06:35 +01:00
Norbert Varzariu
8817ed33ff Merge branch 'release/1.0.0'
- parameterized nearly all aspects of the script
- complete documentation with examples
- configurable database backup scripts
- configurable custom commands script
- configurable mailto for crons
- and much more
2016-01-22 16:03:49 +01:00
Norbert Varzariu
5cb6c2d235 bump version to 1.0.0 \o/ 2016-01-22 16:03:46 +01:00
Norbert Varzariu
daba8a562a Merge branch 'feature/parameterize_backup_scripts' into develop
- parameterize backup scripts
- add custom commands to misc script
- add parameters to mysql and psql scripts
- update documentation
2016-01-22 15:59:02 +01:00
Norbert Varzariu
f67cd5a517 remove debug message 2016-01-22 15:58:18 +01:00
Norbert Varzariu
33e3fa685a parameterize backup_user in scripts templates 2016-01-22 15:57:23 +01:00
Norbert Varzariu
03e385b2aa clean up repo 2016-01-22 15:50:22 +01:00
Norbert Varzariu
b9c0e0cebc add headers to scripts 2016-01-22 15:48:07 +01:00
Norbert Varzariu
46a0a4faaf update README 2016-01-22 15:44:12 +01:00
Norbert Varzariu
441c6a0584 update README 2016-01-22 15:16:55 +01:00
Norbert Varzariu
eb7a73f460 update README 2016-01-22 15:13:09 +01:00
Norbert Varzariu
3bedb6efaa update README 2016-01-22 15:09:29 +01:00
Norbert Varzariu
86073f42b1 add custom commands to misc script 2016-01-22 15:01:32 +01:00
Norbert Varzariu
eb643443fd update README 2016-01-22 14:07:06 +01:00
Norbert Varzariu
8ba0042a94 parameterize backup scripts 2016-01-22 13:17:03 +01:00
Norbert Varzariu
942e9a7697 fix readme 2016-01-22 10:51:37 +01:00
Norbert Varzariu
f7eec6ee5f Merge branch 'release/0.5.2' into develop 2016-01-22 10:43:22 +01:00
Norbert Varzariu
12b11a6a43 Merge branch 'release/0.5.2'
- Update documentation
2016-01-22 10:42:55 +01:00
Norbert Varzariu
b332e2edcb bump version to 0.5.2 2016-01-22 10:42:48 +01:00
Norbert Varzariu
5ee6544312 Merge branch 'hotfix/update_docs' into develop 2016-01-22 10:42:14 +01:00
Norbert Varzariu
dcd5f532a9 Merge branch 'hotfix/update_docs'
- Update README to reflect changes in configuration of backup_scripts
- Add example backup_scripts to README
2016-01-22 10:40:41 +01:00
Norbert Varzariu
16630094cb update README to reflect for v0.4.0 changes in backup_scripts 2016-01-22 10:40:17 +01:00
Norbert Varzariu
d57d87532b add note about range notation to README 2016-01-22 10:28:10 +01:00
Norbert Varzariu
bc3a33e6f0 fix merge conflict 2016-01-22 10:01:39 +01:00
Norbert Varzariu
0f6a6ebe31 fix template 2016-01-22 10:00:49 +01:00
Norbert Varzariu
c80ba48d4c templates/rsnapshot.erb 2016-01-22 09:58:57 +01:00
Norbert Varzariu
e823fef87c fix templates (do not create include/exclude file entries if no in/excludes given) 2016-01-22 09:56:33 +01:00
Norbert Varzariu
638ec858b0 Merge branch 'develop'
- restart cron service after config generation
2016-01-22 09:32:02 +01:00
Norbert Varzariu
d71239645f restart cron service after config change 2016-01-22 09:31:51 +01:00
Norbert Varzariu
7318f9b2dc Merge branch 'release/0.5.1' into develop 2016-01-22 09:18:03 +01:00
Norbert Varzariu
bf55ad97b6 Merge branch 'release/0.5.1' 2016-01-22 09:17:51 +01:00
Norbert Varzariu
4dedb43a22 bump version to 0.5.1 2016-01-22 09:17:49 +01:00
Norbert Varzariu
81ef65edca quick fix trailing slash in params.pp snapshot_root 2016-01-22 09:17:15 +01:00
Norbert Varzariu
9ed7f44a28 Merge branch 'release/0.5.0' into develop 2016-01-22 09:13:13 +01:00
Norbert Varzariu
d786e0088e fix merge issue 2016-01-22 09:12:32 +01:00
Norbert Varzariu
e8a287c4f8 bump version to 0.5.0 2016-01-22 09:10:12 +01:00
Norbert Varzariu
a28b27c505 Merge branch 'feature/rewrite_to_use_deep_merge' into develop
- rewrite large parts of cron file generation
- now using deep_merge to merge possible overrides into the default hash
  (eliminates a lit of spaghetti code)
2016-01-22 09:08:28 +01:00
Norbert Varzariu
0235f202b4 rewrite cron file generation using deep_merge (why is this function undocumented?) 2016-01-22 09:08:12 +01:00
Norbert Varzariu
a5558bf329 Merge branch 'master' of gitlab.flx.bn:devops/puppet-rsnapshot 2016-01-21 16:13:35 +01:00
Norbert Varzariu
d4cd5282f7 quick fixes 2016-01-21 16:12:07 +01:00
Norbert Varzariu
0a489a4eb8 quick fixes 2016-01-21 16:11:56 +01:00
Norbert Varzariu
80d1756087 Merge branch 'release/0.4.2' into develop 2016-01-21 15:19:31 +01:00
Norbert Varzariu
8f7da1a1ee Merge branch 'release/0.4.2'
- add db backup template scripts
2016-01-21 15:19:06 +01:00
21 changed files with 636 additions and 236 deletions

View File

@ -1,3 +0,0 @@
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'

View File

@ -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}"

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.bundle
Gemfile.lock
pkg/
vendor/
log/

View File

@ -2,11 +2,20 @@
sudo: false
language: ruby
cache: bundler
bundler_args: --without system_tests
script: "bundle exec rake validate && bundle exec rake spec SPEC_OPTS='--format documentation'"
matrix:
fast_finish: true
include:
- rvm: 2.1
env: PUPPET_GEM_VERSION="~> 4.0"
script: "bundle exec rake validate"
- rvm: 2.1
env: PUPPET_GEM_VERSION="~> 4.0"
script: "bundle exec rake spec SPEC_OPTS='--format documentation'"
- rvm: 2.1
env: PUPPET_GEM_VERSION="~> 4.0"
script: "bundle exec rake beaker"
services: docker
sudo: required
notifications:
email: false

View File

@ -5,3 +5,10 @@ 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'
group :acceptance do
gem 'beaker-rspec', '5.6.0'
gem 'serverspec', require: false
gem 'specinfra', require: false
end

418
README.md
View File

@ -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
@ -42,6 +42,7 @@ This module is best used with an ENC like hiera. It will make your config much e
* This module will install the rsnapshot package on your system
* This module will manage the rsnapshot config on your system
* This module will manage cron entries for your configured nodes
* This module will manage the cron service on your system
### Setup Requirements
@ -133,10 +134,14 @@ rsnapshot::hosts:
backup:
'/var': './var'
cron:
'daily':
'minute': '0-10'
'hour': '1..5'
mailto: 'bar1@example.com'
daily:
minute: '0-10'
hour: '1..5'
db1:
backup_scripts:
mysql:
misc:
```
@ -146,11 +151,13 @@ rsnapshot::hosts:
The defaults are pretty reasonable, I hope. However, you may override pretty much anything. Available parameters are discussed below.
#### Specials
As mentioned, this module will generate random time entries for your hosts. The random number generator is hashed with hostname and backup_level, so the randomness will be repeatable per host.level. This is important so puppet won't override the crons with each run.
This module will generate random time entries for your hosts. The random number generator is hashed with hostname and backup_level, so the randomness will be repeatable per host.level. This is important so puppet won't override the crons with each run.
You may specify time ranges as follows:
* default cron syntax
* an array with allowed values, for example, if you want the backup for a host to run between 1am and 5am, you would override the hours setting for the host in question.
in hiera this would look like: (Explanation see below)
* an array with allowed values
- for example, if you want the backup for a host to run between 1am and 5am, you would override the hours setting for the host in question.
In hiera this would look like: (Explanation see below)
```yaml
rsnapshot::hosts:
@ -201,49 +208,35 @@ 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
`[ '20..23','0..2' ]`
For the range feature to work, hours >0 and <10 must not have a preceding zero.
Wrong: `00.09`
Correct: `0..9`
Also, you can set a mailto for each host, or globally now. The settings will be merged bottom to top, so if you override a setting in a hosts cron, it will have precedence over the global setting,
which in turn has precedence over the default.
Example:
```puppet
$cron = {
mailto => 'admin@example.com',
hourly => {
minute => '0..59',
hour => [ '20..23','0..2' ],
@ -256,6 +249,7 @@ Or in hiera:
```yaml
rsnapshot::cron:
mailto: 'admin@example.com'
daily:
minute: '20'
weekly:
@ -267,16 +261,32 @@ rsnapshot::cron:
```yaml
rsnapshot::hosts:
webserver:
daily:
hour: [ '20..23','0..2' ]
weekly:
hour: [ '20..23','0..2' ]
cron:
mailto: 'support@example.com'
daily:
hour: [ '20..23','0..2' ]
weekly:
hour: [ '20..23','0..2' ]
webhost:
customervm.provider.com:
backup_user: 'customer'
```
`webhost`: Mails will go to `admin@example.com` (from the global override).
`webserver`: Mails will go to `support@example.com`.
`customervm.provider.com`: The backup (and thus ssh) user will be `customer@customervm.provider.com`
Hash is of the form:
```puppet
$cron =>{
$cron =>{
mailto => param,
daily => {
minute => param,
hour => param,
@ -294,6 +304,7 @@ Default is:
```puppet
$cron = {
mailto => 'admin@example.com',
hourly => {
minute => '0..59', # random from 0 to 59
hour => '*', # you could also do: ['21..23','0..4','5'],
@ -318,13 +329,58 @@ Default is:
monthly => {
minute => '0..59',
hour => '0..23', # you could also do: ['21..23','0..4','5'],
monthday => '0..28',
monthday => '1..28',
month => '*',
weekday => '*',
},
}
```
#### `$cron_dir`
Directory to drop the cron files to. Crons will be created per host.
(Default: /etc/cron.d)
#### `$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)
#### `$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' => './',
}
```
#### `$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)
@ -348,35 +404,68 @@ 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
`mysql`: used for mysql backups
`psql`: used for postgresql backups
`misc`: custom commands to run on the node
You can set
`$dbbackup_user`: backup user
`$dbbackup_password`: password for the backup user
`$dumper`: path to the dump bin you wish to use
`$dump_flags`: flags for your dump bin
`$ignore_dbs`: databases to be ignored (the psql script ignores template and postgres databases by default)
`$commands`: array of commands to run on the host (this has no effect on psql and mysql scripts and is intended for your custom needs, see misc script section)
See below for defaults
NOTE: the psql and mysql scripts will SSH into your host and try and use $dumper.
Make sure you have those tools installed on your DB hosts.
Also, this module will try and use pbzip to compress your databases. You can install pbzip2 (and additional packages you might need) by passing an array to [$rsnapshot::package_name](#package_name)
Default is:
```puppet
$backup_scripts = {
mysql => {
mysql => {
dbbackup_user => 'root',
dbbackup_password => 'myFancyPassWord',
dbbackup_password => '',
dumper => 'mysqldump',
dump_flags => '--single-transaction --quick --routines --ignore-table=mysql.event',
ignore_dbs => [ 'information_schema', 'performance_schema' ],
},
psql => {
dbbackup_user => 'postgres',
dbbackup_password => '',
dumper => 'pg_dump',
dump_flags => '-Fc',
ignore_dbs => [ 'postgres' ],
},
misc => {},
misc => {
commands => $::osfamily ? {
'RedHat' => [
'rpm -qa --qf="%{name}," > packages.txt',
],
'Debian' => [
'dpkg --get-selections > packages.txt',
],
default => [],
},
}
}
```
Configuration example:
@ -395,16 +484,134 @@ rsnapshot::hosts:
backup_scripts:
mysql:
psql:
dumper: '/usr/local/bin/pg_dump'
dump_flags: '-Fc'
ignore_dbs: [ 'db1', 'tmp_db' ]
misc:
bazqux:de:
backup_scripts:
mysql:
dbbackup_user: 'myuser'
dbbackup_password: 'mypassword'
misc:
commands:
- 'cat /etc/hostname > hostname.txt'
- 'date > date.txt'
```
This creates
- a mysql and a psql backup script for `foobar.com` using the credentials `dbbackup:hunter2` for mysql and `dbbackup:yeshorsebatterystaple` for psql
- the psql script will use `/usr/local/bin/pg_dump` as the dump program with flags `-Fc`
- it will ignore the postgres databases `db1` and `tmp_db` for postgres
- a mysql backup script for `bazqux.de` using the credentials `myuser:mypassword`
- a misc script for bazqux.de containing two commands to run on the node. the output will be redirected to hostname.txt and date.txt in the misc/ subfolder of the hosts backup directory (i.e. /snapshot_root/bazqux.de/daily.0/misc/hostname.txt)
The scripts look like this:
##### `bazqux.de`
```bash
#!/bin/bash
host=bazqux.de
user=myuser
pass=mypassword
dbs=(
$(ssh -l root "$host" "mysql -u ${user} -p${pass} -e 'show databases' | sed '1d;/information_schema/d;/performance_schema/d'")
)
for db in "${dbs[@]}"; do
ssh -l root "$host" "mysqldump --user=${user} --password=${pass} --single-transaction --quick --routines --ignore-table=mysql.event ${db}" > "${db}.sql"
wait
pbzip2 "$db".sql
done
```
```bash
#!/bin/bash
ssh bazqux.de 'cat /etc/hostname > hostname.txt'
ssh bazqux.de 'date > date.txt'
```
##### `foobar.com`
psql:
```bash
#!/bin/bash
host=foobar.com
user=dbbackup
pass=yeshorsebatterystaple
PGPASSWORD="$pass"
dbs=(
$(ssh -l root "$host" "psql -U ${user} -Atc \"SELECT datname FROM pg_database WHERE NOT datistemplate AND datname ~ 'postgres|db1|tmp_db'\"" )
)
for db in "${dbs[@]}"; do
ssh -l root "$host" "pg_dump -U ${user} -Fc ${db}" > "$db".sql
wait
pbzip2 "$db".sql
done
```
mysql:
```bash
#!/bin/bash
host=foobar.com
user=dbbackup
pass=hunter2
dbs=(
$(ssh -l root "$host" "mysql -u ${user} -p${pass} -e 'show databases' | sed '1d;/information_schema/d;/performance_schema/d'")
)
for db in "${dbs[@]}"; do
ssh -l root "$host" "mysqldump --user=${user} --password=${pass} --single-transaction --quick --routines --ignore-table=mysql.event ${db}" > "${db}.sql"
wait
pbzip2 "$db".sql
done
```
misc (assuming foobar.com is a RedHat node):
```bash
#!/bin/bash
ssh foobar.com 'rpm -qa --qf "%{name}," > packages.txt'
```
##### another example with root user and empty password
mysql with root user:
```bash
#!/bin/bash
host=bazqux.de
user=root
password=
dbs=(
$(ssh -l root "$host" "mysql -e 'show databases' | sed '1d;/information_schema/d;/performance_schema/d'")
)
for db in "${dbs[@]}"; do
ssh -l root "$host" "mysqldump --single-transaction --quick --routines --ignore-table=mysql.event ${db}" > "${db}.sql"
wait
pbzip2 "$db".sql
done
```
### rsnapshot configuration variables
@ -440,9 +647,25 @@ Default is: undef
#### `$cmd_postexec`
Default is: undef
#### `$use_lvm`
#### `$du_args`
Default is: undef
#### `$exclude`
Default is: []
#### `$exclude_file`
Other than this might suggest, the default behavior is to create an exclude file per host.
Default is: undef
#### `$include`
Default is: []
#### `$include_file`
Default is: undef
#### `$link_dest`
Default is: false
#### `$linux_lvm_cmd_lvcreate`
Default is: undef # '/sbin/lvcreate'
@ -468,6 +691,9 @@ Default is: undef
#### `$linux_lvm_mountpath`
Default is: undef
#### `$lockpath`
Default is: '/var/run/rsnapshot'
#### `$logpath`
Default is: '/var/log/rsnapshot'
@ -475,73 +701,55 @@ Default is: '/var/log/rsnapshot'
unused, we are logging to $logpath/$host.log
Default is: '/var/log/rsnapshot.log'
#### `$lockpath`
Default is: '/var/run/rsnapshot'
#### `$snapshot_root`
Default is: '/backup/'
#### `$no_create_root`
Boolean: true or false
Default is: undef
#### `$verbose`
Default is: '2'
#### `$loglevel`
Default is: '4'
#### `$stop_on_stale_lockfile`
#### `$manage_cron`
Should this module manage the cron service?
Default is: true
#### `$no_create_root`
Boolean: true or false
Default is: undef
#### `$rsync_short_args`
Default is: '-az'
#### `$rsync_long_args`
rsync defaults are: --delete --numeric-ids --relative --delete-excluded
Default is: undef
#### `$ssh_args`
Default is: undef
#### `$du_args`
Default is: undef
#### `$one_fs`
Default is: undef
#### `$retain`
Default is: { }
#### `$include`
Default is: []
#### `$exclude`
Default is: []
#### `$include_file`
#### `$rsync_short_args`
Default is: '-az'
#### `$rsync_long_args`
rsync defaults are: --delete --numeric-ids --relative --delete-excluded
Default is: undef
#### `$exclude_file`
Other than this might suggest, the default behavior is to create an exclude file per host.
#### `$rsync_numtries`
Default is: 1
#### `$snapshot_root`
Default is: '/backup/'
#### `$ssh_args`
Default is: undef
#### `$link_dest`
Default is: false
#### `$stop_on_stale_lockfile`
Boolean: true or false
Default is: undef
#### `$sync_first`
Default is: false
#### `$rsync_numtries`
Default is: 1
#### `$use_lvm`
Default is: undef
#### `$use_lazy_deletes`
Default is: false
#### `$verbose`
Default is: '2'
## Limitations
Currently, this module support CentOS, Fedora, Ubuntu and Debian.
@ -553,5 +761,5 @@ want it off the face of the planet, feel free to get in touch with me.
Norbert Varzariu (loomsen)
## Contributors
Please see the [list of contributors.](https://github.com/loomsen/puppet-bloonix_agent/graphs/contributors)
Please see the [list of contributors.](https://github.com/loomsen/puppet-rsnapshot/graphs/contributors)
A big thank you to Hendrik Horeis <hendrik.horeis@gmail.com> for all his input and testing of this module.

View File

@ -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
@ -11,7 +11,9 @@ class rsnapshot::config (
$lockpath = pick($rsnapshot::lockpath, $rsnapshot::params::config_lockpath, '/var/run/rsnapshot')
$conf_d = pick($rsnapshot::conf_d, $rsnapshot::params::conf_d, '/etc/rsnapshot')
$snapshot_root = pick($hosts['snapshot_root'], $rsnapshot::snapshot_root, '/backup')
$default_cron = assert_empty_hash($::rsnapshot::cron)
$logpath = pick($rsnapshot::logpath, $rsnapshot::params::config_logpath)
$cronfile_prefix_use = pick($rsnapshot::cronfile_prefix_use, $rsnapshot::params::config_cronfile_prefix_use, false)
$cronfile_prefix = pick($rsnapshot::cronfile_prefix, $rsnapshot::params::config_cronfile_prefix, '')
# make sure lock path and conf path exist
file { $conf_d:
ensure => 'directory',
@ -25,14 +27,18 @@ class rsnapshot::config (
file { $snapshot_root:
ensure => 'directory',
}
file { $logpath:
ensure => directory,
}
# 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)
$hosts_clean.each |String $host, $hash | {
$backup_user = pick($hash['backup_user'], $rsnapshot::params::config_backup_user)
$backup_user = pick($hash['backup_user'], $rsnapshot::backup_user, $rsnapshot::params::config_backup_user, 'root')
$default_backup_dirs = pick($rsnapshot::default_backup, $rsnapshot::params::config_default_backup)
$backup_levels = pick($hash['backup_levels'], $rsnapshot::backup_levels, 'weekly')
$backup = $hash['backup']
@ -56,7 +62,6 @@ class rsnapshot::config (
$linux_lvm_vgpath = pick_undef($hash['linux_lvm_vgpath'], $rsnapshot::params::config_linux_lvm_vgpath)
$linux_lvm_mountpath = pick_undef($hash['linux_lvm_mountpath'], $rsnapshot::params::config_linux_lvm_mountpath)
$no_create_root = pick_undef($hash['no_create_root'], $rsnapshot::params::config_no_create_root)
$logpath = pick($hash['logpath'], $rsnapshot::logpath, $rsnapshot::params::config_logpath)
$verbose = pick($hash['verbose'], $rsnapshot::params::config_verbose)
$loglevel = pick($hash['loglevel'], $rsnapshot::params::config_loglevel)
$stop_on_stale_lockfile = pick_undef($hash['stop_on_stale_lockfile'], $rsnapshot::params::config_stop_on_stale_lockfile)
@ -77,7 +82,7 @@ class rsnapshot::config (
$rsync_numtries = pick_undef($hash['rsync_numtries'], $rsnapshot::params::config_rsync_numtries)
#$backup_scripts = pick_undef($hash['backup_scripts'], $rsnapshot::params::config_backup_scripts)
$snapshot_dir = "${config_snapshot_root}/${host}"
$snapshot_dir = "${snapshot_root}/${host}"
$config = "${conf_d}/${host}.rsnapshot.conf"
$lockfile = "${lockpath}/${host}.pid"
$logfile = "${logpath}/${host}.log"
@ -98,6 +103,7 @@ class rsnapshot::config (
if ! ( $interval and $retain ) {
$interval = pick($hash['interval'], $rsnapshot::params::config_interval)
}
# rsnapshot wants numeric values
if $link_dest {
$link_dest_num = bool2num($link_dest)
@ -108,6 +114,9 @@ class rsnapshot::config (
if $use_lazy_deletes {
$use_lazy_deletes_num = bool2num($use_lazy_deletes)
}
if $one_fs {
$one_fs_num = bool2num($one_fs)
}
$real_include = $rsnapshot::include + $include
unless empty($real_include) {
@ -117,7 +126,7 @@ class rsnapshot::config (
}
}
$real_exclude = $rsnapshot::exclude + $exclude
$real_exclude = $rsnapshot::exclude + $exclude
unless empty($real_exclude) {
file { $exclude_file:
ensure => 'file',
@ -132,21 +141,22 @@ class rsnapshot::config (
content => template('rsnapshot/rsnapshot.erb'),
}
if has_key($hash, backup_scripts) {
$hash[backup_scripts].each |$script, $credentials| {
if is_hash($credentials) {
$dbbackup_user = $credentials['dbbackup_user']
$dbbackup_password = $credentials['dbbackup_password']
} else {
$dbbackup_user = $rsnapshot::default_backup_scripts[$script]['dbbackup_user']
$dbbackup_password = $rsnapshot::default_backup_scripts[$script]['dbbackup_password']
}
$hash[backup_scripts].each |$script, $scriptconf| {
$real_script = deep_merge($rsnapshot::params::backup_scripts[$script], $rsnapshot::backup_scripts[$script], $hash[backup_scripts][$script])
$dbbackup_user = $real_script[dbbackup_user]
$dbbackup_password = $real_script[dbbackup_password]
$dumper = $real_script[dumper]
$dump_flags = $real_script[dump_flags]
$ignore_dbs = $real_script[ignore_dbs]
$compress = $real_script[compress]
$commands = $real_script[commands]
concat::fragment { "${host}_${script}_backup":
target => $config,
content => "backup_script ${conf_d}/${host}.${script}.sh ./${script}\n",
target => $config,
content => "backup_script ${conf_d}/${host}.${script}.sh ./${script}\n",
}
file { "${conf_d}/${host}.${script}.sh":
@ -154,70 +164,55 @@ 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}":
content => "#This file is managed by puppet\nMAILTO=${real_cron[mailto]}\n\n",
target => $cronfile,
order => 1,
}
$backup_levels.each |String $level| {
$mailto = $real_cron[mailto]
$minute = rand_from_array($real_cron[$level][minute], "${host}.${level}.minute")
$hour = rand_from_array($real_cron[$level][hour], "${host}.${level}.hour")
$monthday = rand_from_array($real_cron[$level][monthday], "${host}.${level}.monthday")
$month = rand_from_array($real_cron[$level][month], "${host}.${level}.month")
$weekday = rand_from_array($real_cron[$level][weekday], "${host}.${level}.weekday")
# allow to globally override ranges, create random numbers for backup_levels daily, weekly, monthly
if has_key($hash,cron){
if has_key($hash[cron], $level) {
$cron = $hash[cron][$level]
} else {
if has_key($default_cron, $level) {
$cron = $default_cron[$level]
} else {
$cron = $rsnapshot::params::cron[$level]
}
}
} else {
if has_key($default_cron, $level) {
$cron = $default_cron[$level]
} else {
$cron = $rsnapshot::params::cron[$level]
}
}
if has_key($cron, minute) {
$c_min = $cron[minute]
} else {
$c_min = $rsnapshot::params::cron[$level][minute]
}
if has_key($cron, hour) {
$c_hour = $cron[hour]
} else {
$c_hour = $rsnapshot::params::cron[$level][hour]
}
if has_key($cron, monthday) {
$c_monthday = $cron[monthday]
} else {
$c_monthday = $rsnapshot::params::cron[$level][monthday]
}
if has_key($cron, month) {
$c_month = $cron[month]
} else {
$c_month = $rsnapshot::params::cron[$level][month]
}
if has_key($cron, weekday) {
$c_weekday = $cron[weekday]
} else {
$c_weekday = $rsnapshot::params::cron[$level][weekday]
}
$minute = rand_from_array($c_min, "${host}.${level}.minute")
$hour = rand_from_array($c_hour, "${host}.${level}.hour")
$monthday = rand_from_array($c_monthday, "${host}.${level}.monthday")
$month = rand_from_array($c_month, "${host}.${level}.month")
$weekday = rand_from_array($c_weekday, "${host}.${level}.weekday")
concat::fragment { "${host}.${level}":
target => $cronfile,
content => template('rsnapshot/cron.erb'),
order => 2,
}
}
}
}

View File

@ -5,28 +5,36 @@
# === 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,
$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,
$backup_user = $rsnapshot::params::config_backup_user,
$cron_service_name = $rsnapshot::params::cron_service_name,
$manage_cron = $rsnapshot::params::manage_cron,
$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
$default_exclude = $rsnapshot::params::config_exclude + $exclude
if $hosts {
class { '::rsnapshot::install': }->
class { '::rsnapshot::config': }
class { '::rsnapshot::config': }~>
class { '::rsnapshot::service': }
contain '::rsnapshot::install'
contain '::rsnapshot::config'
contain '::rsnapshot::service'
}
}

View File

@ -10,5 +10,18 @@ class rsnapshot::install {
ensure => $rsnapshot::package_ensure,
}
# ensure run directory exists (systemd clears /var/run, so rsnapshot can't create PID files after reboot - issue#12)
$lockpath = pick($rsnapshot::lockpath, $rsnapshot::params::config_lockpath, '/var/run/rsnapshot')
$tmpfiles_d = '/etc/tmpfiles.d'
file { "${tmpfiles_d}":
ensure => directory,
}
file { "${tmpfiles_d}/rsnapshot.conf":
ensure => present,
content => "D ${lockpath} 0755 root root -",
}
}

View File

@ -7,10 +7,17 @@ class rsnapshot::params {
$config_backup_user = 'root'
$package_name = 'rsnapshot'
$package_ensure = 'present'
$cron_service_name = $::osfamily ? {
'RedHat' => 'crond',
'Debian' => 'cron',
default => '',
}
$manage_cron = true
$cron_dir = '/etc/cron.d'
$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'
@ -20,6 +27,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'
@ -32,13 +41,13 @@ class rsnapshot::params {
$config_logpath = '/var/log/rsnapshot'
$config_logfile = '/var/log/rsnapshot.log' # unused, we are logging to $logpath/$host.log
$config_lockpath = '/var/run/rsnapshot'
$config_snapshot_root = '/backup/'
$config_snapshot_root = '/backup'
$config_no_create_root = undef # bool, true or false
$config_verbose = '2'
$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
@ -62,6 +71,7 @@ class rsnapshot::params {
}
$config_backup_scripts = {}
$cron = {
mailto => 'admin@example.com',
hourly => {
minute => '0..59',
hour => '*', # you could also do: ['21..23','0..4','5'],
@ -86,20 +96,38 @@ class rsnapshot::params {
monthly => {
minute => '0..59',
hour => '0..23', # you could also do: ['21..23','0..4','5'],
monthday => '0..28',
monthday => '1..28',
month => '*',
weekday => '*',
},
}
$backup_scripts = {
mysql => {
mysql => {
dbbackup_user => 'root',
dbbackup_password => 'myFancyPassWord',
dbbackup_password => '',
dumper => 'mysqldump',
dump_flags => '--single-transaction --quick --routines --ignore-table=mysql.event',
ignore_dbs => [ 'information_schema', 'performance_schema' ],
compress => 'pbzip2',
},
psql => {
dbbackup_user => 'postgres',
dbbackup_password => '',
dumper => 'pg_dump',
dump_flags => '-Fc',
ignore_dbs => [ 'postgres' ],
compress => 'pbzip2',
},
misc => {
commands => $::osfamily ? {
'RedHat' => [
'rpm -qa --qf="%{name}," > packages.txt',
],
'Debian' => [
'dpkg --get-selections > packages.txt',
],
default => [],
},
},
misc => {},
}
}

13
manifests/service.pp Normal file
View File

@ -0,0 +1,13 @@
# == Class: rsnapshot::service
#
# Reloads cron
class rsnapshot::service (
$manage_cron = $rsnapshot::manage_cron
) {
if $manage_cron {
service { $rsnapshot::cron_service_name:
ensure => running,
}
}
}

View File

@ -1,6 +1,6 @@
{
"name": "loomsen-rsnapshot",
"version": "0.4.2",
"version": "1.2.5",
"author": "loomsen",
"summary": "Configures rsnapshot.",
"license": "Apache-2.0",
@ -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": [
{
@ -31,11 +28,11 @@
},
{
"operatingsystem": "Ubuntu",
"operatingsystemrelease": [ "12.04", "10.04", "14.04" ]
"operatingsystemrelease": [ "12.04", "12.10", "13.04", "13.10", "14.04", "14.10", "15.04", "15.10", "16.04", "16.10", "17.04" ]
},
{
"operatingsystem": "Fedora",
"operatingsystemrelease": [ "17", "18", "19", "20", "21", "22", "23", "24" ]
"operatingsystemrelease": [ "17", "18", "19", "20", "21", "22", "23", "24", "25" ]
}
]
}

View File

@ -0,0 +1,63 @@
require 'spec_helper_acceptance'
describe 'rsnapshot' do
context 'with defaults' do
it 'run idempotently' do
pp = <<-EOS
class { 'rsnapshot':
hosts => {
'localhost' => {},
'example.com' => {
backup_defaults => false,
backup => {
'/var/' => './'
}
}
}
}
EOS
apply_manifest(pp, catch_failures: true)
apply_manifest(pp, catch_changes: true)
end
end
context 'packages installed' do
describe package('rsnapshot') do
it { is_expected.to be_installed }
end
end
context 'files provisioned' do
describe file('/etc/tmpfiles.d') do
it { should be_directory }
end
describe file('/etc/tmpfiles.d/rsnapshot.conf') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'D /var/run/rsnapshot 0755 root root -' }
end
describe file('/var/run/rsnapshot') do
it { should be_directory }
end
describe file('/etc/rsnapshot/localhost.rsnapshot.conf') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'backup' }
end
describe file('/etc/rsnapshot/example.com.rsnapshot.conf') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'backup\troot@example.com:/var/\t./' }
end
describe file('/etc/rsnapshot.conf') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'localhost' }
its(:content) { is_expected.to match 'example.com' }
end
describe file('/etc/rsnapshot/localhost.rsnapshot.conf') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'backup' }
end
describe file('/etc/cron.d/example_com') do
it { is_expected.to exist }
its(:content) { is_expected.to match 'example.com' }
end
end
end

View File

@ -0,0 +1,15 @@
HOSTS:
debian-8-x64:
platform: debian-8-amd64
hypervisor: docker
image: debian:8
docker_container_name: puppet_rsnapshot
docker_preserve_image: true
docker_cmd: '["/sbin/init"]'
docker_image_commands:
- 'echo deb http://ftp.debian.org/debian jessie-backports main >> /etc/apt/sources.list'
- 'apt-get update && apt-get install -y cron locales-all net-tools wget'
- 'rm -f /usr/sbin/policy-rc.d'
CONFIG:
trace_limit: 200
masterless: true

View File

@ -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

View File

@ -0,0 +1,26 @@
require 'puppet'
require 'beaker-rspec'
require 'yaml'
install_puppet_agent_on hosts, {}
RSpec.configure do |c|
# Module root and settings
module_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
module_name = module_root.split('/').last.sub('-', '_').split('_').last()
c.formatter = :documentation
c.max_displayed_failure_line_count = 5
c.before :suite do
puts 'Install module'
puppet_module_install(source: module_root, module_name: module_name)
hosts.each do |host|
puts 'Install fixtures'
on host, puppet('module','install','stahnma/epel')
on host, puppet('module','install','puppetlabs/stdlib')
on host, puppet('module','install','puppetlabs/concat')
end
end
end

View File

@ -1 +1 @@
<%= @minute %> <%= @hour %> <%= @month %> <%= @monthday %> <%= @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 %>

View File

@ -1,10 +1,7 @@
#!/bin/bash
# add custom stuff here
# FIXME: remember to concat for custom stuff after the last line of the puppet generated script
<% if @osfamily == 'RedHat' -%>
ssh <%=@host-%> rpm -qa --qf='%{name},' > packages.txt
#This file is managed by puppet
#
<%@commands.each do |command| -%>
ssh -l <%=@backup_user-%> <%=@host-%> <%=command-%>
<%end-%>
#
#
#
# ++++++++++++++++++++++++++++++++++++++++++++

View File

@ -1,16 +1,29 @@
#!/bin/bash
# This file is managed by puppet
# written by Norbert Varzariu <loomsen@gmail.com>
# This Script is triggered by rsnapshot and dumps the specified dbs on the configured host.
#
host=<%=@host%>
user=<%=@dbbackup_user%>
pass=<%=@dbbackup_password%>
dbs=( $(mysql -h "$host" -u "$user" -p"$pass" -e 'show databases' | sed '1d;/information_schema/d;/performance_schema/d') )
<% if (@dbbackup_user == 'root' && @dbbackup_password == '') -%>
dbs=(
$(ssh -l <%=@backup_user-%> "$host" "mysql -e 'show databases' | sed '1d;<%@ignore_dbs.to_a.each do |db|-%>/<%=db-%>/d;<%end-%>'" )
)
<%else-%>
dbs=(
$(ssh -l <%=@backup_user-%> "$host" "mysql -u <%=@dbbackup_user-%> -p'<%=@dbbackup_password-%>' -e 'show databases' | sed '1d;<%@ignore_dbs.each do |db|-%>/<%=db-%>/d;<%end-%>'" )
)
<%end-%>
for db in "${dbs[@]}"; do
mysqldump --host="$host" --user="$user" --password="$pass" --single-transaction --quick --routines --ignore-table=mysql.event "$db" > "$db".sql
<% 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
<%end-%>
wait
pbzip2 -p3 "$db".sql
<% if @compress != '' -%>
<%=@compress-%> "$db".sql
<%end-%>
done

View File

@ -1,17 +1,19 @@
#!/bin/bash
# This file is managed by puppet
# written by Norbert Varzariu <loomsen@gmail.com>
# This Script is triggered by rsnapshot and dumps the specified dbs on the configured host.
#
host=<%=@host%>
user=<%=@dbbackup_user%>
pass=<%=@dbbackup_password%>
PGPASSWORD="$pass"
dbs=( $(psql -h "$host" -U "$user" -Atc "SELECT datname FROM pg_database WHERE NOT datistemplate AND datname <> 'postgres'") )
dbs=(
$(ssh -l <%=@backup_user-%> "$host" "PGPASSWORD='<%=@dbbackup_password%>' psql -U ${user} -Atc \"SELECT datname FROM pg_database WHERE NOT datistemplate AND NOT datname ~ '<%@ignore_dbs.each do |db|-%><%if db == @ignore_dbs.last-%><%=db-%><%else-%><%=db-%>|<%end-%><%end-%>'\"")
)
for db in "${dbs[@]}"; do
ssh -l root "$host" "pg_dump -U ${user} -Fc ${db}" > "$db".sql
ssh -l <%=@backup_user-%> "$host" "PGPASSWORD='<%=@dbbackup_password%>' <%=@dumper-%> -U ${user} <%=@dump_flags-%> ${db}" > "$db".sql
wait
pbzip2 -p3 "$db".sql
<% if @compress != '' -%>
<%=@compress-%> "$db".sql
<%end-%>
done

View File

@ -85,12 +85,12 @@ du_args <%= @du_args %>
<% if @one_fs != '' -%>
one_fs <%= @one_fs_num %>
<% end -%>
<% if @include != '' -%>
<% unless @real_include.empty? -%>
<% if @include_file != '' -%>
include_file <%= @include_file %>
<% end -%>
<% end -%>
<% if @exclude != '' -%>
<% unless @real_exclude.empty? -%>
<% if @exclude_file != '' -%>
exclude_file <%= @exclude_file %>
<% end -%>