From e191e47b0b4dee5088b448b4475f598b4019b576 Mon Sep 17 00:00:00 2001
From: Christian Elberfeld <elberfeld@web.de>
Date: Tue, 25 Jul 2017 19:42:52 +0200
Subject: [PATCH] =?UTF-8?q?rolle=20f=C3=BCr=20borgbackup?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 common/borgbackup/tasks/main.yml              | 48 +++++++++++++++++++
 .../borgbackup/templates/borgbackup-check.sh  |  6 +++
 .../borgbackup/templates/borgbackup-create.sh | 19 ++++++++
 .../borgbackup/templates/borgbackup-delete.sh | 12 +++++
 .../borgbackup/templates/borgbackup-info.sh   | 12 +++++
 .../borgbackup/templates/borgbackup-init.sh   |  7 +++
 .../borgbackup/templates/borgbackup-list.sh   |  7 +++
 .../borgbackup/templates/borgbackup-mount.sh  |  8 ++++
 common/borgbackup/templates/logrotate         |  7 +++
 host_vars/webserver                           | 14 ++++++
 webserver/main.yml                            |  1 +
 11 files changed, 141 insertions(+)
 create mode 100644 common/borgbackup/tasks/main.yml
 create mode 100644 common/borgbackup/templates/borgbackup-check.sh
 create mode 100644 common/borgbackup/templates/borgbackup-create.sh
 create mode 100644 common/borgbackup/templates/borgbackup-delete.sh
 create mode 100644 common/borgbackup/templates/borgbackup-info.sh
 create mode 100644 common/borgbackup/templates/borgbackup-init.sh
 create mode 100644 common/borgbackup/templates/borgbackup-list.sh
 create mode 100644 common/borgbackup/templates/borgbackup-mount.sh
 create mode 100644 common/borgbackup/templates/logrotate

diff --git a/common/borgbackup/tasks/main.yml b/common/borgbackup/tasks/main.yml
new file mode 100644
index 00000000..ff7735c2
--- /dev/null
+++ b/common/borgbackup/tasks/main.yml
@@ -0,0 +1,48 @@
+---
+# Pakete installieren
+- name: pakete installieren
+  apt:
+    pkg: "{{ item }}"
+    update_cache: yes
+    state: installed
+  with_items:
+    - borgbackup
+    - logrotate
+    - moreutils
+
+- name: get secrets from server 1
+  slurp: src={{ item }}
+  with_items:
+    - /srv/borgbackup/repo_passphrase 
+    - /srv/borgbackup/repo_url 
+  register: borgbackup_secrets
+
+- name: get secrets from server 2
+  set_fact: 
+    repo_passphrase: "{{ borgbackup_secrets.results | selectattr('item', 'equalto', '/srv/borgbackup/repo_passphrase') | map(attribute='content') | list | first | b64decode | regex_replace('\\s', '') }}" 
+    repo_url: "{{ borgbackup_secrets.results | selectattr('item', 'equalto', '/srv/borgbackup/repo_url') | map(attribute='content') | list | first | b64decode | regex_replace('\\s', '') }}" 
+
+
+# BorgBackup Scripte erstellen 
+
+- name: BorgBackup Script erstellen 
+  template: src={{ item }} dest=/opt/{{ item }} mode=o+x
+  with_items:
+    - "borgbackup-check.sh"
+    - "borgbackup-create.sh"
+    - "borgbackup-delete.sh"
+    - "borgbackup-info.sh"
+    - "borgbackup-init.sh"
+    - "borgbackup-list.sh"
+    - "borgbackup-mount.sh"
+
+- name: BorgBackup log folder erstellen 
+  file: 
+    path: "/var/log/borgbackup"
+    state: "directory"
+
+- name: BorgBackup LogRotate config erstellen 
+  template: src=logrotate dest=/etc/logrotate.d/borgbackup
+
+- name: Cronjob für BorgBackup
+  cron: name="borgbackup" weekday="{{borgbackup_weekday}}" hour="{{borgbackup_hour}}" minute="{{borgbackup_minute}}" job="/opt/borgbackup-create.sh 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /var/log/borgbackup/borgbackup.log"
\ No newline at end of file
diff --git a/common/borgbackup/templates/borgbackup-check.sh b/common/borgbackup/templates/borgbackup-check.sh
new file mode 100644
index 00000000..dbdfd2f0
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-check.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+# Überprüfung des Archives 
+borg check $1 $2 $3 --info --show-rc {{repo_url}}
diff --git a/common/borgbackup/templates/borgbackup-create.sh b/common/borgbackup/templates/borgbackup-create.sh
new file mode 100644
index 00000000..9185d6de
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-create.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+# Ausführung des Backups
+# anschließend Bereinigung 
+# abschließend Integritätscheck 
+
+borg create $1 $2 $3 --info --show-rc --stats --compression lzma,2 {{repo_url}}::`date +%Y-%m-%d_%H_%M` \
+{% for directory in borgbackup_directories %}
+{{ directory }} \
+{% endfor %}
+&& \
+borg prune $1 $2 $3 --info --show-rc --list {{repo_url}} \
+{% for prune in borgbackup_prune %}
+{{ prune }} \
+{% endfor %}
+&& \
+borg check $1 $2 $3 --info --show-rc {{repo_url}}
diff --git a/common/borgbackup/templates/borgbackup-delete.sh b/common/borgbackup/templates/borgbackup-delete.sh
new file mode 100644
index 00000000..12d0e11f
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-delete.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+# Löschen eines Backups
+
+borg list $1 $2 $3 --info --show-rc {{repo_url}}
+
+echo "BackupName, followed by [ENTER]:"
+read target
+
+borg delete $1 $2 $3 --info --show-rc {{repo_url}}::$target
diff --git a/common/borgbackup/templates/borgbackup-info.sh b/common/borgbackup/templates/borgbackup-info.sh
new file mode 100644
index 00000000..a3117262
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-info.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+#  Anzeige des Inhaltes im Borg Backup Archiv
+
+borg list $1 $2 $3 --info --show-rc {{repo_url}}
+
+echo "BackupName, followed by [ENTER]:"
+read target
+
+borg info $1 $2 $3 --info --show-rc {{repo_url}}::$target
diff --git a/common/borgbackup/templates/borgbackup-init.sh b/common/borgbackup/templates/borgbackup-init.sh
new file mode 100644
index 00000000..8e97c70c
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-init.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# Initialisierung des Borg Backup Archives
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+borg init $1 $2 $3 --info --show-rc --encryption=repokey {{repo_url}} 
diff --git a/common/borgbackup/templates/borgbackup-list.sh b/common/borgbackup/templates/borgbackup-list.sh
new file mode 100644
index 00000000..07bd9086
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-list.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+# Anzeige des Inhaltes im Borg Backup Archiv
+
+borg list $1 $2 $3 --info --show-rc {{repo_url}} 
diff --git a/common/borgbackup/templates/borgbackup-mount.sh b/common/borgbackup/templates/borgbackup-mount.sh
new file mode 100644
index 00000000..7b79b686
--- /dev/null
+++ b/common/borgbackup/templates/borgbackup-mount.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+export BORG_PASSPHRASE="{{repo_passphrase}}"
+
+# Einhängen eines Backups nach /mnt/
+
+echo -n 'Mounting to: /mnt/borbbackupmount'
+borg mount $1 $2 $3 --info --show-rc {{repo_url}} /mnt/borbbackupmount
diff --git a/common/borgbackup/templates/logrotate b/common/borgbackup/templates/logrotate
new file mode 100644
index 00000000..b17a8fe9
--- /dev/null
+++ b/common/borgbackup/templates/logrotate
@@ -0,0 +1,7 @@
+/var/log/borgbackup/borgbackup.log {
+  rotate 12
+  monthly
+  compress
+  missingok
+  notifempty
+}
diff --git a/host_vars/webserver b/host_vars/webserver
index 97248340..efba09cd 100644
--- a/host_vars/webserver
+++ b/host_vars/webserver
@@ -12,6 +12,20 @@ debian_sources:
   - "deb http://ftp.halifax.rwth-aachen.de/debian/ jessie-updates main contrib non-free"
   - "deb http://apt.dockerproject.org/repo debian-jessie main"
 
+borgbackup_weekday: "*"
+borgbackup_hour: "4"
+borgbackup_minute: "0"
+
+borgbackup_directories:
+  - "/etc/"
+  - "/srv/"
+
+borgbackup_prune:
+  - "--keep-within=2d"
+  - "--keep-daily=7"
+  - "--keep-weekly=4"
+  - "--keep-monthly=6"
+
 letsencrypt_tos_sha256: 6373439b9f29d67a5cd4d18cbc7f264809342dbf21cb2ba2fc7588df987a6221
 
 letsencrypt_mail: verwaltung@warpzone.ms
diff --git a/webserver/main.yml b/webserver/main.yml
index 67fccb04..7514f84e 100644
--- a/webserver/main.yml
+++ b/webserver/main.yml
@@ -3,6 +3,7 @@
 - hosts: webserver
   remote_user: root
   roles:
+    - { role: ../common/borgbackup, tags: borgbackup }
     - { role: nginx, tags: nginx }
     - { role: openvpn, tags: openvpn }
     - { role: docker, tags: docker }
-- 
GitLab