Implement rsnapshot backups on infrastructure
This commit is contained in:
parent
3dc0e04ab4
commit
828539dceb
42
dev/host_vars/rsnapshot.yml
Normal file
42
dev/host_vars/rsnapshot.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# base
|
||||||
|
allow_reboot: false
|
||||||
|
manage_network: false
|
||||||
|
|
||||||
|
# docker
|
||||||
|
docker_users:
|
||||||
|
- vagrant
|
||||||
|
|
||||||
|
# traefik
|
||||||
|
traefik_version: latest
|
||||||
|
traefik_dashboard: true
|
||||||
|
traefik_domain: traefik.vm.krislamo.org
|
||||||
|
traefik_auth: admin:$apr1$T1l.BCFz$Jyg8msXYEAUi3LLH39I9d1 # admin:admin
|
||||||
|
#traefik_acme_email: realemail@example.com # Let's Encrypt settings
|
||||||
|
#traefik_production: true
|
||||||
|
|
||||||
|
# nginx
|
||||||
|
nginx_domain: nginx.vm.krislamo.org
|
||||||
|
nginx_name: staticsite
|
||||||
|
nginx_repo_url: https://git.krislamo.org/kris/example-website/
|
||||||
|
nginx_auth: admin:$apr1$T1l.BCFz$Jyg8msXYEAUi3LLH39I9d1 # admin:admin
|
||||||
|
nginx_version: latest
|
||||||
|
|
||||||
|
# rsnapshot
|
||||||
|
rsnapshot:
|
||||||
|
- name: webserver
|
||||||
|
intervals:
|
||||||
|
hourly: 6
|
||||||
|
daily: 4
|
||||||
|
cron:
|
||||||
|
- interval: hourly
|
||||||
|
minute: "*/2" # every even minute
|
||||||
|
#minute: 0
|
||||||
|
- interval: daily
|
||||||
|
minute: "1-59/2" # every odd minute
|
||||||
|
#minute: 0
|
||||||
|
#hourly: 0
|
||||||
|
backups:
|
||||||
|
- name: staticsite
|
||||||
|
source: "/opt/nginx/{{ nginx_name }}/"
|
||||||
|
- name: logs
|
||||||
|
source: /var/log/
|
11
dev/rsnapshot.yml
Normal file
11
dev/rsnapshot.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
- name: Install rsnapshot backup server
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
vars_files:
|
||||||
|
- host_vars/rsnapshot.yml
|
||||||
|
roles:
|
||||||
|
- base
|
||||||
|
- docker
|
||||||
|
- traefik
|
||||||
|
- nginx
|
||||||
|
- rsnapshot
|
1
roles/.gitignore
vendored
1
roles/.gitignore
vendored
@ -11,6 +11,7 @@
|
|||||||
!nextcloud*/
|
!nextcloud*/
|
||||||
!nginx*/
|
!nginx*/
|
||||||
!prometheus*/
|
!prometheus*/
|
||||||
|
!rsnapshot*/
|
||||||
!traefik*/
|
!traefik*/
|
||||||
!unifi*/
|
!unifi*/
|
||||||
!wordpress*/
|
!wordpress*/
|
||||||
|
3
roles/rsnapshot/defaults/main.yml
Normal file
3
roles/rsnapshot/defaults/main.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
rsnapshot_confdir: /etc/rsnapshot.d
|
||||||
|
rsnapshot_logdir: /var/log/rsnapshot
|
||||||
|
rsnapshot_root: /srv/backups/{{ item.name }}
|
53
roles/rsnapshot/tasks/main.yml
Normal file
53
roles/rsnapshot/tasks/main.yml
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Copyright (C) 2021 Kris Lamoureux
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, version 3 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
- name: Install rsnapshot
|
||||||
|
apt:
|
||||||
|
name: rsnapshot
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Create rsnapshot system directories
|
||||||
|
file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
loop:
|
||||||
|
- "{{ rsnapshot_confdir }}"
|
||||||
|
- "{{ rsnapshot_logdir }}"
|
||||||
|
|
||||||
|
- name: Create snapshot_root directories
|
||||||
|
file:
|
||||||
|
path: "{{ item.root | default(rsnapshot_root) }}"
|
||||||
|
state: directory
|
||||||
|
loop: "{{ rsnapshot }}"
|
||||||
|
|
||||||
|
- name: Install rsnapshot configuration
|
||||||
|
template:
|
||||||
|
src: rsnapshot.conf.j2
|
||||||
|
dest: "{{ rsnapshot_confdir }}/{{ item.name }}.conf"
|
||||||
|
loop: "{{ rsnapshot }}"
|
||||||
|
|
||||||
|
- name: Install rsnapshot crons
|
||||||
|
cron:
|
||||||
|
name: "{{ item.1.interval }} rsnapshot of {{ item.0.name }}"
|
||||||
|
job: "/usr/bin/rsnapshot -c {{ rsnapshot_confdir }}/{{ item.0.name }}.conf {{ item.1.interval }}"
|
||||||
|
user: "root"
|
||||||
|
minute: "{{ item.1.minute | default('*') }}"
|
||||||
|
hour: "{{ item.1.hourly | default('*') }}"
|
||||||
|
day: "{{ item.1.day | default('*') }}"
|
||||||
|
weekday: "{{ item.1.weekday | default('*') }}"
|
||||||
|
month: "{{ item.1.month | default('*') }}"
|
||||||
|
cron_file: "rsnapshot-{{ item.0.name }}"
|
||||||
|
with_subelements:
|
||||||
|
- "{{ rsnapshot }}"
|
||||||
|
- cron
|
110
roles/rsnapshot/templates/rsnapshot.conf.j2
Normal file
110
roles/rsnapshot/templates/rsnapshot.conf.j2
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
# {{ ansible_managed }}
|
||||||
|
# rsnapshot.conf - rsnapshot configuration file
|
||||||
|
# This file requires tabs between elements
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# CONFIG FILE VERSION #
|
||||||
|
#######################
|
||||||
|
|
||||||
|
config_version 1.2
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# SNAPSHOT ROOT DIRECTORY #
|
||||||
|
###########################
|
||||||
|
|
||||||
|
# All snapshots will be stored under this root directory.
|
||||||
|
{% if item.root is defined %}
|
||||||
|
snapshot_root {{ item.root }}
|
||||||
|
{% else %}
|
||||||
|
snapshot_root {{ rsnapshot_root }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# if no_create_root is enabled, rsnapshot will not automatically create the
|
||||||
|
# snapshot_root directory. this is particularly useful if you are backing
|
||||||
|
# up to removable media, such as a firewire or usb drive.
|
||||||
|
{% if item.nocreateroot is defined and not item.nocreateroot %}
|
||||||
|
no_create_root 0
|
||||||
|
{% else %}
|
||||||
|
no_create_root 1
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# external program dependencies #
|
||||||
|
#################################
|
||||||
|
|
||||||
|
cmd_cp /bin/cp
|
||||||
|
cmd_rm /bin/rm
|
||||||
|
cmd_rsync /usr/bin/rsync
|
||||||
|
cmd_ssh /usr/bin/ssh
|
||||||
|
cmd_logger /usr/bin/logger
|
||||||
|
cmd_du /usr/bin/du
|
||||||
|
cmd_rsnapshot_diff /usr/bin/rsnapshot-diff
|
||||||
|
|
||||||
|
####################
|
||||||
|
# backup intervals #
|
||||||
|
####################
|
||||||
|
|
||||||
|
{% for backup in item.intervals %}
|
||||||
|
retain {{ backup }} {{ item.intervals[backup] }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
############################################
|
||||||
|
# global options #
|
||||||
|
# all are optional, with sensible defaults #
|
||||||
|
############################################
|
||||||
|
|
||||||
|
# verbose level, 1 through 5.
|
||||||
|
# 1 quiet print fatal errors only
|
||||||
|
# 2 default print errors and warnings only
|
||||||
|
# 3 verbose show equivalent shell commands being executed
|
||||||
|
# 4 extra verbose show extra verbose information
|
||||||
|
# 5 debug mode everything
|
||||||
|
{% if item.verbose is defined %}
|
||||||
|
verbose {{ item.verbose }}
|
||||||
|
{% else %}
|
||||||
|
verbose 3
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# same as "verbose" above, but controls the amount of data sent to the
|
||||||
|
# logfile, if one is being used. the default is 3.
|
||||||
|
# if you want the rsync output, you have to set it to 4
|
||||||
|
{% if item.loglevel is defined %}
|
||||||
|
loglevel {{ item.loglevel }}
|
||||||
|
{% else %}
|
||||||
|
loglevel 3
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# If you enable this, data will be written to the file you specify. The
|
||||||
|
# amount of data written is controlled by the "loglevel" parameter.
|
||||||
|
logfile /var/log/rsnapshot/{{ item.name }}.log
|
||||||
|
|
||||||
|
# If enabled, rsnapshot will write a lockfile to prevent two instances
|
||||||
|
# from running simultaneously (and messing up the snapshot_root).
|
||||||
|
# If you enable this, make sure the lockfile directory is not world
|
||||||
|
# writable. Otherwise anyone can prevent the program from running.
|
||||||
|
lockfile /var/run/rsnapshot-{{ item.name }}.pid
|
||||||
|
|
||||||
|
# When sync_first is enabled, it changes the default behaviour of rsnapshot.
|
||||||
|
# Normally, when rsnapshot is called with its lowest interval
|
||||||
|
# (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest
|
||||||
|
# intervals. With sync_first enabled, "rsnapshot sync" handles the file sync,
|
||||||
|
# and all interval calls simply rotate files.
|
||||||
|
{% if item.syncfirst is defined and item.syncfirst %}
|
||||||
|
sync_first 1
|
||||||
|
{% else %}
|
||||||
|
sync_first 0
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# Number of rsync re-tries. If you experience any network problems or
|
||||||
|
# network card issues that tend to cause ssh to fail with errors like
|
||||||
|
# "Corrupted MAC on input", for example, set this to a non-zero value
|
||||||
|
# to have the rsync operation re-tried.
|
||||||
|
rsync_numtries 3
|
||||||
|
|
||||||
|
###############################
|
||||||
|
### BACKUP POINTS / SCRIPTS ###
|
||||||
|
###############################
|
||||||
|
|
||||||
|
{% for backup in item.backups %}
|
||||||
|
backup {{ backup.source }} {{ backup.name }}/
|
||||||
|
{% endfor %}
|
Loading…
Reference in New Issue
Block a user