From e8c06b36ea15829489f207b0b5f42525108a635f Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Sun, 5 Jun 2016 16:10:32 +0200 Subject: [PATCH] borg-client: Propery postgres backup --- playbooks/apollo.yml | 2 +- playbooks/orion.yml | 2 +- roles/borg-client/tasks/main.yml | 13 +++++++++++++ .../templates/backup-postgres.sh.j2 | 18 ++++++++++++++++++ roles/borg-client/templates/borg-backup.sh.j2 | 2 +- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 roles/borg-client/templates/backup-postgres.sh.j2 diff --git a/playbooks/apollo.yml b/playbooks/apollo.yml index cd4e6841..b42303fc 100644 --- a/playbooks/apollo.yml +++ b/playbooks/apollo.yml @@ -8,4 +8,4 @@ - tools - sshd - ssh_keys - - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/apollo" } + - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/apollo", postgres_backup_dir: "/var/lib/postgres/backup" } diff --git a/playbooks/orion.yml b/playbooks/orion.yml index dc50bced..7907f4ae 100644 --- a/playbooks/orion.yml +++ b/playbooks/orion.yml @@ -8,7 +8,7 @@ - tools - sshd - ssh_keys - - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/orion" } + - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/orion", postgres_backup_dir: None } - { role: opendkim, dkim_selector: orion } - { role: postfix} - archusers diff --git a/roles/borg-client/tasks/main.yml b/roles/borg-client/tasks/main.yml index 38f3e0a4..083a5181 100644 --- a/roles/borg-client/tasks/main.yml +++ b/roles/borg-client/tasks/main.yml @@ -18,6 +18,19 @@ - name: install borg backup script template: src=borg-backup.sh.j2 dest=/usr/local/bin/borg-backup.sh owner=root group=root mode=755 +- name: install postgres backup script + template: src=backup-postgres.sh.j2 dest=/usr/local/bin/backup-postgres.sh owner=root group=root mode=755 + when: postgres_backup_dir != None + +- name: check whether postgres user exists + command: getent passwd postgres + register: check_postgres_user + ignore_errors: True + +- name: make postgres backup directory + file: path=/var/lib/postgres/backup owner=postgres group=postgres state=directory + when: check_postgres_user|succeeded and postgres_backup_dir != None + - name: install systemd timers for backup copy: src={{ item }} dest=/etc/systemd/system/{{ item }} owner=root group=root mode=644 with_items: diff --git a/roles/borg-client/templates/backup-postgres.sh.j2 b/roles/borg-client/templates/backup-postgres.sh.j2 new file mode 100644 index 00000000..4fdd940e --- /dev/null +++ b/roles/borg-client/templates/backup-postgres.sh.j2 @@ -0,0 +1,18 @@ +#!/bin/bash +# +# Script to backup all postgres databases individually +# +# Requires local login with `postgres` user and either trusted or peer auth. +# + +DBLIST=($(sudo -u postgres psql -d postgres -qt -c 'SELECT datname from pg_database')) +for db in "${DBLIST[@]}"; do + if [[ $db =~ template[01] ]]; then + continue; + fi + echo "Dumping $db to {{ postgres_backup_dir }}"; + sudo -u postgres pg_dump --serializable-deferrable -Fc "$db" > "{{ postgres_backup_dir }}/$db.dump" +done + +echo "Dumping globals to {{ postgres_backup_dir }}" +sudo -u postgres pg_dumpall --globals-only > "{{ postgres_backup_dir }}/globals.sql.dump" diff --git a/roles/borg-client/templates/borg-backup.sh.j2 b/roles/borg-client/templates/borg-backup.sh.j2 index d587f3a6..2ff08cc6 100644 --- a/roles/borg-client/templates/borg-backup.sh.j2 +++ b/roles/borg-client/templates/borg-backup.sh.j2 @@ -1,7 +1,7 @@ #!/usr/bin/env bash # In case there is postgresql running, dump all of it somewhere. -systemctl status postgresql && pg_dumpall -f /root/postgres_dump.sql +systemctl status postgresql && /usr/local/bin/backup-postgres.sh borg create -v --stats -C lz4 -e /proc \ -e /sys -e /dev -e /run -e /tmp -e /var/cache \