diff --git a/common/borgbackup/tasks/main.yml b/common/borgbackup/tasks/main.yml index ff7735c2bd9eb31b23037aa1565d7477a83be043..4f57ddaf2961c1dd9db6707b8b28433ef729b58f 100644 --- a/common/borgbackup/tasks/main.yml +++ b/common/borgbackup/tasks/main.yml @@ -9,24 +9,52 @@ - borgbackup - logrotate - moreutils + - openssl + +- name: create directory + file: + path: "/srv/borgbackup/" + state: "directory" + +- name: create directories + file: + path: "/srv/borgbackup/{{ item }}" + state: "directory" + with_items: "{{ borgbackup_repos }}" + +- name: generate new repo_passphrase (check) + stat: + path: /srv/borgbackup/repo_passphrase + register: repo_passphrase + +- name: generate new repo_passphrase (generate) + command: openssl rand -base64 -out /srv/borgbackup/repo_passphrase 24 + when: repo_passphrase.stat.exists == False + +- name: generate new repo_sshkey (check) + stat: + path: /srv/borgbackup/repo_sshkey + register: repo_sshkey + +- name: generate new repo_sshkey (generate) + command: ssh-keygen -N '' -t ed25519 -f /srv/borgbackup/repo_sshkey + when: repo_sshkey.stat.exists == False - 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 +- name: BorgBackup Scripte erstellen + template: src={{ item }} dest=/srv/borgbackup/{{ item }} mode=o+x with_items: - "borgbackup-check.sh" - "borgbackup-create.sh" @@ -35,6 +63,7 @@ - "borgbackup-init.sh" - "borgbackup-list.sh" - "borgbackup-mount.sh" + - "borgbackup-prometheus.sh" - name: BorgBackup log folder erstellen file: @@ -42,7 +71,18 @@ state: "directory" - name: BorgBackup LogRotate config erstellen - template: src=logrotate dest=/etc/logrotate.d/borgbackup + template: + src: logrotate + dest: /etc/logrotate.d/borgbackup + +- name: Alten cronjob entfernen falls vorhanden + cron: + name: "borgbackup" + state: absent + +- name: Cronjob für BorgBackup Backup + cron: name="borgbackup-create" weekday="{{borgbackup_weekday}}" hour="{{borgbackup_hour}}" minute="{{borgbackup_minute}}" job="/srv/borgbackup/borgbackup-create.sh 2>&1 | ts '[\\%Y-\\%m-\\%d \\%H:\\%M:\\%S]' >> /var/log/borgbackup/borgbackup.log" -- 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 +- name: Cronjob für BorgBackup Prometheus export + cron: name="borgbackup-prom" weekday="*" hour="*" minute="0" job="/srv/borgbackup/borgbackup-prometheus.sh 2>&1 | ts '[\\%Y-\\%m-\\%d \\%H:\%M:\\%S]' >> /var/log/borgbackup/borgbackup.log" + diff --git a/common/borgbackup/templates/borgbackup-check.sh b/common/borgbackup/templates/borgbackup-check.sh index dbdfd2f0f1837bbb3f98e79838d5d6f928ec810f..bf0ac7237f2daa2f960cdce77dac054e13658fd4 100644 --- a/common/borgbackup/templates/borgbackup-check.sh +++ b/common/borgbackup/templates/borgbackup-check.sh @@ -1,6 +1,14 @@ #!/bin/bash +# Überprüfung der Backup Archive + export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" + + +{% for repo_url in borgbackup_repos %} + +echo "===[ Check Repo: {{repo_url}} ]============================================================" +borg check $1 $2 $3 --info --show-rc --remote-path borg1 {{repo_url}} -# Überprüfung des Archives -borg check $1 $2 $3 --info --show-rc {{repo_url}} +{% endfor %} \ No newline at end of file diff --git a/common/borgbackup/templates/borgbackup-create.sh b/common/borgbackup/templates/borgbackup-create.sh index 9185d6decb0e5688139511393ec972a8da3385bd..4351531da5eb21c45a782d0828a6b4971a23435d 100644 --- a/common/borgbackup/templates/borgbackup-create.sh +++ b/common/borgbackup/templates/borgbackup-create.sh @@ -1,12 +1,18 @@ #!/bin/bash export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" +export BACKUP_DATE=`date +%Y-%m-%d_%H_%M` -# Ausführung des Backups +# Ausführung der 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 repo_url in borgbackup_repos %} + +echo "===[ Create Backup: {{repo_url}} ]============================================================" + +borg create $1 $2 $3 --info --show-rc --remote-path borg1 --stats --compression lzma,2 {{repo_url}}::$BACKUP_DATE \ {% for directory in borgbackup_directories %} {{ directory }} \ {% endfor %} @@ -17,3 +23,5 @@ borg prune $1 $2 $3 --info --show-rc --list {{repo_url}} \ {% endfor %} && \ borg check $1 $2 $3 --info --show-rc {{repo_url}} + +{% endfor %} diff --git a/common/borgbackup/templates/borgbackup-delete.sh b/common/borgbackup/templates/borgbackup-delete.sh index 12d0e11f87abd265ead9e048b0305a83ad01fcdd..b42369dd757ac0b56c38e350837759ef546235d3 100644 --- a/common/borgbackup/templates/borgbackup-delete.sh +++ b/common/borgbackup/templates/borgbackup-delete.sh @@ -1,12 +1,24 @@ #!/bin/bash export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" # Löschen eines Backups -borg list $1 $2 $3 --info --show-rc {{repo_url}} +echo "Available Repos: " + +{% for repo_url in borgbackup_repos %} +echo "{{repo_url}}" +{% endfor %} + +echo "RepoName, followed by [ENTER]:" +read repo_url + +echo "Available Backups: " + +borg list $1 $2 $3 --info --show-rc --remote-path borg1 $repo_url echo "BackupName, followed by [ENTER]:" read target -borg delete $1 $2 $3 --info --show-rc {{repo_url}}::$target +borg delete $1 $2 $3 --info --show-rc --remote-path borg1 $repo_url::$target diff --git a/common/borgbackup/templates/borgbackup-info.sh b/common/borgbackup/templates/borgbackup-info.sh index a311726275efcc8edca20e0d32da11057c0f3447..d0d14f2db512af7a434cf04f2390a80c81028839 100644 --- a/common/borgbackup/templates/borgbackup-info.sh +++ b/common/borgbackup/templates/borgbackup-info.sh @@ -1,12 +1,29 @@ #!/bin/bash export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" -# Anzeige des Inhaltes im Borg Backup Archiv +# Anzeige des Inhaltes in den Borg Backup Archiven -borg list $1 $2 $3 --info --show-rc {{repo_url}} +{% for repo_url in borgbackup_repos %} -echo "BackupName, followed by [ENTER]:" -read target +BACKUPS=$(borg list $1 $2 $3 --info --show-rc --remote-path borg1 {{repo_url}}) + +echo "=============================================" +echo "Backups List " +echo "$BACKUPS" + +BACKUPS_LIST=$(echo "$BACKUPS" | awk '{print $1}') + +for BACKUP in $BACKUPS_LIST; do + + echo "=============================================" + + borg info $1 $2 $3 --info --show-rc --remote-path borg1 {{repo_url}}::$BACKUP + +done + +echo "=============================================" + +{% endfor %} -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 index 8e97c70ce30ff94f43354423c50c5d3a31ce4e24..7d12e5b75e98c156f2bb41854769db1cabe5a431 100644 --- a/common/borgbackup/templates/borgbackup-init.sh +++ b/common/borgbackup/templates/borgbackup-init.sh @@ -1,7 +1,23 @@ #!/bin/bash -# Initialisierung des Borg Backup Archives +# Initialisierung der Borg Backup Archives +# Der SSH key aus /srv/borgbackup/repo_sshkey muss vorher auf den Backupserver übertragen werden export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" -borg init $1 $2 $3 --info --show-rc --encryption=repokey {{repo_url}} +{% for repo_url in borgbackup_repos %} + +if [ ! -e "{{repo_url}}.initialized" ]; then + + echo "Initialize Repo: {{repo_url}}" + date > "{{repo_url}}.initialized" + + borg init $1 $2 $3 --info --show-rc --remote-path borg1 --encryption=repokey {{repo_url}} +else + + echo "Repo already initialized: {{repo_url}}" + +fi + +{% endfor %} diff --git a/common/borgbackup/templates/borgbackup-list.sh b/common/borgbackup/templates/borgbackup-list.sh index 07bd9086ce2f8169532fd9c2d59c3ec68524544f..6d0fe73938e2fd2f58706ba058d4ff0e45d2ec41 100644 --- a/common/borgbackup/templates/borgbackup-list.sh +++ b/common/borgbackup/templates/borgbackup-list.sh @@ -1,7 +1,14 @@ #!/bin/bash export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" -# Anzeige des Inhaltes im Borg Backup Archiv +# Anzeige des Inhaltes in den Borg Backup Archiven + +{% for repo_url in borgbackup_repos %} + +echo "===[ List Repo: {{repo_url}} ]============================================================" +borg list $1 $2 $3 --info --show-rc --remote-path borg1 {{repo_url}} + +{% endfor %} -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 index 7b79b686c1594d9c1013c599a797bce7c3f62a38..86e2e0e973e2544b69e2df1929da34f12410e85a 100644 --- a/common/borgbackup/templates/borgbackup-mount.sh +++ b/common/borgbackup/templates/borgbackup-mount.sh @@ -1,8 +1,21 @@ #!/bin/bash export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" -# Einhängen eines Backups nach /mnt/ +# Einhängen der Repos in /mnt/ + +echo "Available Repos: " + +{% for repo_url in borgbackup_repos %} +echo "{{repo_url}}" +{% endfor %} + +echo "RepoName, followed by [ENTER]:" +read repo_url + +echo -n 'Mounting to: /mnt' + +mkdir /mnt/ +borg mount $1 $2 $3 --info --show-rc --remote-path borg1 $repo_url /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/borgbackup-prometheus.sh b/common/borgbackup/templates/borgbackup-prometheus.sh new file mode 100644 index 0000000000000000000000000000000000000000..c5c4cd9f0b83b946a402399afae4c55352c1cae6 --- /dev/null +++ b/common/borgbackup/templates/borgbackup-prometheus.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +export BORG_PASSPHRASE="{{repo_passphrase}}" +export BORG_RSH="ssh -i /srv/borgbackup/repo_sshkey" + +# Metrics output file in the prometheus node-exporter directory +PROM_FILE="/var/lib/prometheus/node-exporter/borgbackup.prom" + +# Borgbackup statistiken für Prometheus erstellen + +function calc_bytes { + NUM=$1 + UNIT=$2 + + case "$UNIT" in + kB) + echo $NUM | awk '{ print $1 * 1024 }' + ;; + MB) + echo $NUM | awk '{ print $1 * 1024 * 1024 }' + ;; + GB) + echo $NUM | awk '{ print $1 * 1024 * 1024 * 1024 }' + ;; + TB) + echo $NUM | awk '{ print $1 * 1024 * 1024 * 1024 * 1024 }' + ;; + esac +} + +echo "borgbackup_repos_count {{borgbackup_repos|length}}" > $TMP_FILE + +{% for repo_url in borgbackup_repos %} + +BACKUPS=$(borg list --remote-path borg1 {{repo_url}}) +BACKUPS_LIST=$(echo "$BACKUPS" | awk '{print $1}') +COUNTER=0 + +for BACKUP in $BACKUPS_LIST; do + + COUNTER=$((COUNTER+1)) + +done + +BORG_INFO=$(borg info --remote-path borg1 {{repo_url}}::$BACKUP) + +# create temp file +TMP_FILE=$(mktemp) + +echo "borgbackup_count{repo="{{ repo_url }}"} $COUNTER" > $TMP_FILE +echo "borgbackup_files{repo="{{ repo_url }}"} $(echo "$BORG_INFO" | grep "Number of files" | awk '{print $4}')" >> $TMP_FILE +echo "borgbackup_chunks_unique{repo="{{ repo_url }}"} $(echo "$BORG_INFO" | grep "Chunk index" | awk '{print $3}')" >> $TMP_FILE +echo "borgbackup_chunks_total{repo="{{ repo_url }}"} $(echo "$BORG_INFO" | grep "Chunk index" | awk '{print $4}')" >> $TMP_FILE + +# byte size calculation +LAST_SIZE=$(calc_bytes $(echo "$BORG_INFO" |grep "This archive" |awk '{print $3}') $(echo "$BORG_INFO" |grep "This archive" |awk '{print $4}')) +LAST_SIZE_COMPRESSED=$(calc_bytes $(echo "$BORG_INFO" |grep "This archive" |awk '{print $5}') $(echo "$BORG_INFO" |grep "This archive" |awk '{print $6}')) +LAST_SIZE_DEDUP=$(calc_bytes $(echo "$BORG_INFO" |grep "This archive" |awk '{print $7}') $(echo "$BORG_INFO" |grep "This archive" |awk '{print $8}')) +TOTAL_SIZE=$(calc_bytes $(echo "$BORG_INFO" |grep "All archives" |awk '{print $3}') $(echo "$BORG_INFO" |grep "All archives" |awk '{print $4}')) +TOTAL_SIZE_COMPRESSED=$(calc_bytes $(echo "$BORG_INFO" |grep "All archives" |awk '{print $5}') $(echo "$BORG_INFO" |grep "All archives" |awk '{print $6}')) +TOTAL_SIZE_DEDUP=$(calc_bytes $(echo "$BORG_INFO" |grep "All archives" |awk '{print $7}') $(echo "$BORG_INFO" |grep "All archives" |awk '{print $8}')) + +echo "borgbackup_last_size{repo="{{ repo_url }}"} $LAST_SIZE" >> $TMP_FILE +echo "borgbackup_last_size_compressed{repo="{{ repo_url }}"} $LAST_SIZE_COMPRESSED" >> $TMP_FILE +echo "borgbackup_last_size_dedup{repo="{{ repo_url }}"} $LAST_SIZE_DEDUP" >> $TMP_FILE +echo "borgbackup_total_size{repo="{{ repo_url }}"} $TOTAL_SIZE" >> $TMP_FILE +echo "borgbackup_total_size_compressed{repo="{{ repo_url }}"} $TOTAL_SIZE_COMPRESSED" >> $TMP_FILE +echo "borgbackup_total_size_dedup{repo="{{ repo_url }}"} $TOTAL_SIZE_DEDUP" >> $TMP_FILE + +{% endfor %} + +# move temp file to output file +mv $TMP_FILE $PROM_FILE +chown prometheus:prometheus $PROM_FILE + +echo "created BorgBackup statistic for $COUNTER backups in $PROM_FILE" +