From 39a60084c4e02cd07c4e8a4fc118df85ba30a063 Mon Sep 17 00:00:00 2001 From: Timo Makinen Date: Sat, 8 Nov 2014 15:43:59 +0200 Subject: [PATCH] postgresql: Added postgresql::server::backup class for database backups. --- postgresql/manifests/init.pp | 41 +++++++++++++++++++++++++++ postgresql/templates/pgsql-backup.erb | 35 +++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100755 postgresql/templates/pgsql-backup.erb diff --git a/postgresql/manifests/init.pp b/postgresql/manifests/init.pp index d954b11..d136e1c 100644 --- a/postgresql/manifests/init.pp +++ b/postgresql/manifests/init.pp @@ -102,3 +102,44 @@ class postgresql::server($datadir="/srv/pgsql") { } } + + +# Install PostgreSQL daily backup job +# +# === Global variables +# +# $datadir: +# Directory where PostgreSQL backups are stored. Defaults +# to /srv/pgsql-backup +# +# $maxage: +# How long to keep MariaDB backups. Defaults to 7 days. +# +class postgresql::server::backup($datadir="/srv/pgsql-backup", $maxage="7") { + + file { $datadir: + ensure => directory, + mode => "0700", + owner => "postgres", + group => "postgres", + } + + file { "/usr/local/sbin/pgsql-backup": + ensure => present, + content => template("postgresql/pgsql-backup.erb"), + mode => "0755", + owner => "root", + group => "root", + require => File[$datadir], + } + + cron { "pgsql-backup": + command => "/usr/local/sbin/pgsql-backup", + environment => [ "MAILTO=root", ], + user => "postgres", + hour => "0", + minute => "20", + require => File["/usr/local/sbin/pgsql-backup"], + } + +} diff --git a/postgresql/templates/pgsql-backup.erb b/postgresql/templates/pgsql-backup.erb new file mode 100755 index 0000000..0d7c9a0 --- /dev/null +++ b/postgresql/templates/pgsql-backup.erb @@ -0,0 +1,35 @@ +#!/bin/sh + +umask 077 + +if [ `whoami` != postgres ]; then + echo "ERR: Script needs to be run as postgres user" 1>&2 + exit 1 +fi + +DESTDIR="<%= @datadir %>" +MAXAGE="<%= @maxage %>" + +DATE=`date "+%Y-%m-%d"` + +if [ ! -d ${DESTDIR} ]; then + echo "ERR: PostgreSQL backup directory [${DESTDIR}] does not exist" 1>&2 + exit 1 +fi + +cd ${DESTDIR} && { + find . -xdev -mindepth 2 -maxdepth 2 -type f -mtime +7 -execdir rm -f -- {} \; + find . -xdev -depth -mindepth 1 -maxdepth 1 -type d -empty -execdir rmdir -- {} \; +} + +DESTDIR=${DESTDIR}/${DATE} +mkdir -p ${DESTDIR} + +for db in `psql -l -t | sed -n 's/^ \([^ ]\+\) .*/\1/p'`; do + case ${db} in + template*) + continue + ;; + esac + pg_dump ${db} | gzip > ${DESTDIR}/${db}.${DATE}.gz +done