028d655375
This adds roles to implement backup with borg [1]. Our current tool "bup" has no Python 3 support and is not packaged for Ubuntu Focal. This means it is effectively end-of-life. borg fits our model of servers backing themselves up to a central location, is well documented and seems well supported. It also has the clarkb seal of approval :) As mentioned, borg works in the same manner as bup by doing an efficient back up over ssh to a remote server. The core of these roles are the same as the bup based ones; in terms of creating a separate user for each host and deploying keys and ssh config. This chooses to install borg in a virtualenv on /opt. This was chosen for a number of reasons; firstly reading the history of borg there have been incompatible updates (although they provide a tool to update repository formats); it seems important that we both pin the version we are using and keep clients and server in sync. Since we have a hetrogenous distribution collection we don't want to rely on the packaged tools which may differ. I don't feel like this is a great application for a container; we actually don't want it that isolated from the base system because it's goal is to read and copy it offsite with as little chance of things going wrong as possible. Borg has a lot of support for encrypting the data at rest in various ways. However, that introduces the possibility we could lose both the key and the backup data. Really the only thing stopping this is key management, and if we want to go down this path we can do it as a follow-on. The remote end server is configured via ssh command rules to run in append-only mode. This means a misbehaving client can't delete its old backups. In theory we can prune backups on the server side -- something we could not do with bup. The documentation has been updated but is vague on this part; I think we should get some hosts in operation, see how the de-duplication is working out and then decide how we want to mange things long term. Testing is added; a focal and bionic host both run a full backup of themselves to the backup server. Pretty cool, the logs are in /var/log/borg-backup-<host>.log. No hosts are currently in the borg groups, so this can be applied without affecting production. I'd suggest the next steps are to bring up a borg-based backup server and put a few hosts into this. After running for a while, we can add all hosts, and then deprecate the current bup-based backup server in vexxhost and replace that with a borg-based one; giving us dual offsite backups. [1] https://borgbackup.readthedocs.io/en/stable/ Change-Id: I2a125f2fac11d8e3a3279eb7fa7adb33a3acaa4e
32 lines
1001 B
YAML
32 lines
1001 B
YAML
# note borg_user is the parent loop variable name; this works on each
|
|
# element from the borg_users global.
|
|
- name: Set variables
|
|
set_fact:
|
|
user_name: '{{ borg_user[0] }}'
|
|
user_key: '{{ borg_user[1] }}'
|
|
|
|
- name: Create borg user
|
|
user:
|
|
name: '{{ user_name }}'
|
|
comment: 'Backup user'
|
|
shell: /bin/bash
|
|
home: '/opt/backups/{{ user_name }}'
|
|
create_home: yes
|
|
register: homedir
|
|
|
|
- name: Create borg user authorized key
|
|
authorized_key:
|
|
user: '{{ user_name }}'
|
|
state: present
|
|
key: '{{ user_key }}'
|
|
key_options: 'command="/opt/borg/bin/borg serve --append-only --restrict-to-path /opt/backups/{{ user_name }}/backup",restrict'
|
|
|
|
# ansible-lint wants this in a handler, it should be done here and
|
|
# now; this isn't like a service restart where multiple things might
|
|
# call it.
|
|
- name: Initalise borg
|
|
command: /opt/borg/bin/borg init --encryption=none /opt/backups/{{ user_name }}/backup
|
|
become: yes
|
|
become_user: '{{ user_name }}'
|
|
when: homedir.changed
|