diff --git a/manifests/backup.pp b/manifests/backup.pp index 7b31679..585621d 100644 --- a/manifests/backup.pp +++ b/manifests/backup.pp @@ -26,6 +26,12 @@ define mysql_backup::backup ( } } + if ! defined(Package['mysql-client']) { + package { 'mysql-client': + ensure => present, + } + } + cron { "${name}-backup": ensure => present, command => "/usr/bin/mysqldump --defaults-file=${defaults_file} --opt --ignore-table mysql.event --all-databases | gzip -9 > ${dest_dir}/${name}.sql.gz", diff --git a/manifests/backup_remote.pp b/manifests/backup_remote.pp new file mode 100644 index 0000000..257c363 --- /dev/null +++ b/manifests/backup_remote.pp @@ -0,0 +1,67 @@ +# == Define: mysql_backup::backup_remote +# +# Arguments determine when backups should be taken, where they should +# be located, and how often they shouled be rotated. Additionally +# provide remote DB authentication details for that DB to be backed up. +# This define assumes that the mysqldump command is installed under +# /usr/bin. All reachable DBs and tables will be backed up. +# +define mysql_backup::backup_remote ( + $database_host, + $database_user, + $database_password, + $minute = '0', + $hour = '0', + $day = '*', + $dest_dir = '/var/backups/mysql_backups', + $rotation = 'daily', + $num_backups = '30' +) { + # Wrap in check as there may be mutliple backup defines backing + # up to the same dir. + if ! defined(File[$dest_dir]) { + file { $dest_dir: + ensure => directory, + mode => '0755', + owner => 'root', + group => 'root', + } + } + $defaults_file = "/root/.${name}_db.cnf" + file { $defaults_file: + ensure => present, + mode => '0400', + owner => 'root', + group => 'root', + content => template('mysql_backup/my.cnf.erb'), + } + + if ! defined(Package['mysql-client']) { + package { 'mysql-client': + ensure => present, + } + } + + cron { "${name}-backup": + ensure => present, + command => "/usr/bin/mysqldump --defaults-file=${defaults_file} --opt --ignore-table mysql.event --all-databases | gzip -9 > ${dest_dir}/${name}.sql.gz", + minute => $minute, + hour => $hour, + weekday => $day, + require => [ + File[$dest_dir], + File[$defaults_file], + ], + } + + include logrotate + logrotate::file { "${name}-rotate": + log => "${dest_dir}/${name}.sql.gz", + options => [ + 'nocompress', + "rotate ${num_backups}", + $rotation, + ], + require => Cron["${name}-backup"], + } +} diff --git a/templates/my.cnf.erb b/templates/my.cnf.erb new file mode 100644 index 0000000..c168a7d --- /dev/null +++ b/templates/my.cnf.erb @@ -0,0 +1,4 @@ +[client] +host=<%= database_host %> +user=<%= database_user %> +password=<%= database_password %>