Implement rsnapshot backups on infrastructure
This commit is contained in:
		
							
								
								
									
										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 %}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user