initial version: hadoly's
This commit is contained in:
59
README.md
Normal file
59
README.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
Role Name
|
||||||
|
=========
|
||||||
|
|
||||||
|
Install borg software + config file + cronjob
|
||||||
|
|
||||||
|
Todo
|
||||||
|
----
|
||||||
|
|
||||||
|
<del>le script borg.sh devrait être dans un répo à part et ce playbook devrait récupérer une version précise.</del>
|
||||||
|
|
||||||
|
chaque serveur devrait avoir sa propre clé de chiffrement.
|
||||||
|
|
||||||
|
|
||||||
|
Role Variables
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Defaults set in defaults/main.yml
|
||||||
|
|
||||||
|
borg_dirs - list of directories to backup - default to /root and /etc
|
||||||
|
borg_release - default to 1.1.4
|
||||||
|
borg_key - encryption key - définie dans group_vars/all
|
||||||
|
borg_server - default to vm2
|
||||||
|
borg_account - default to backup
|
||||||
|
borg_remote_dir - remote base directory for repos - default to /var/backups/borg
|
||||||
|
borg_passphrase - no default, should be set on a per host basis
|
||||||
|
borg_rotate - num of days of backup we keep - default 15
|
||||||
|
borg_script_dir - defaults to /root/bin/borg/
|
||||||
|
|
||||||
|
Some variables should be set on a per host basis ( key, dir, ...)
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Example Playbook
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
|
||||||
|
|
||||||
|
---
|
||||||
|
- hosts: leodagan.hadoly.fr
|
||||||
|
become: true
|
||||||
|
remote_user: thomas
|
||||||
|
roles:
|
||||||
|
- borg_client
|
||||||
|
|
||||||
|
ansible-playbook -K test_borg.yml --vault-id=~/.ansible_hadoly.secret
|
||||||
|
|
||||||
|
ansible_hadoly.secret contient la clé de chiffrement
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
BSD
|
||||||
|
|
||||||
|
Author Information
|
||||||
|
------------------
|
||||||
|
|
||||||
|
An optional section for the role authors to include contact information, or a website (HTML is not allowed).
|
||||||
9
defaults/main.yml
Normal file
9
defaults/main.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
# defaults file for borg_client
|
||||||
|
borg_release: 1.1.4
|
||||||
|
borg_dirs: "/etc /root"
|
||||||
|
borg_server: vm2.hadoly.fr
|
||||||
|
borg_remote_dir: /var/backups/borg
|
||||||
|
borg_account: backup
|
||||||
|
borg_rotate: 15
|
||||||
|
borg_script_dir: /root/bin
|
||||||
55
files/borg.sh
Executable file
55
files/borg.sh
Executable file
@@ -0,0 +1,55 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# wrapper around borgbackup
|
||||||
|
# need a borg.conf file - see example file
|
||||||
|
# need passwordless ssh access if using remote repo
|
||||||
|
conf=$(dirname $0)/borg.conf
|
||||||
|
if [ ! -f $conf ] ; then
|
||||||
|
echo config file not found
|
||||||
|
exit 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
source $conf
|
||||||
|
|
||||||
|
TODAY=$(date "+%Y%m%d")
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
("list")
|
||||||
|
if [ ! -z $2 ] ; then
|
||||||
|
${borg} list $options ${REPOSITORY}::${2}
|
||||||
|
ret=$?
|
||||||
|
else
|
||||||
|
${borg} list $options $REPOSITORY
|
||||||
|
ret=$?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
("check")
|
||||||
|
shift
|
||||||
|
# if arg: check archive, if not: check whole repo
|
||||||
|
if [ $# -eq 1 ] ; then
|
||||||
|
target=${REPOSITORY}::${1}
|
||||||
|
else
|
||||||
|
target=${REPOSITORY}
|
||||||
|
fi
|
||||||
|
${borg} check -v ${target}
|
||||||
|
ret=$?
|
||||||
|
;;
|
||||||
|
(info)
|
||||||
|
yesterday=$(date -d "yesterday 13:00 " '+%Y%m%d')
|
||||||
|
yesterday_archive=${REPOSITORY}::$(hostname)_${yesterday}
|
||||||
|
$borg check -v $yesterday_archive
|
||||||
|
ret=$?
|
||||||
|
;;
|
||||||
|
("extract")
|
||||||
|
${borg} extract ${REPOSITORY}::${2} ${3}
|
||||||
|
ret=$?
|
||||||
|
;;
|
||||||
|
(*)
|
||||||
|
${borg} create $options --compression lzma,5 $REPOSITORY::$(hostname)_${TODAY} ${src}
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -eq 0 ] ; then
|
||||||
|
${borg} prune $options $REPOSITORY --prefix $(hostname)_ --keep-daily=${rotate}
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit $ret
|
||||||
2
handlers/main.yml
Normal file
2
handlers/main.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# handlers file for borg_client
|
||||||
53
meta/main.yml
Normal file
53
meta/main.yml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
galaxy_info:
|
||||||
|
author: your name
|
||||||
|
description: your role description
|
||||||
|
company: your company (optional)
|
||||||
|
|
||||||
|
# If the issue tracker for your role is not on github, uncomment the
|
||||||
|
# next line and provide a value
|
||||||
|
# issue_tracker_url: http://example.com/issue/tracker
|
||||||
|
|
||||||
|
# Choose a valid license ID from https://spdx.org - some suggested licenses:
|
||||||
|
# - BSD-3-Clause (default)
|
||||||
|
# - MIT
|
||||||
|
# - GPL-2.0-or-later
|
||||||
|
# - GPL-3.0-only
|
||||||
|
# - Apache-2.0
|
||||||
|
# - CC-BY-4.0
|
||||||
|
license: license (GPL-2.0-or-later, MIT, etc)
|
||||||
|
|
||||||
|
min_ansible_version: 2.9
|
||||||
|
|
||||||
|
# If this a Container Enabled role, provide the minimum Ansible Container version.
|
||||||
|
# min_ansible_container_version:
|
||||||
|
|
||||||
|
#
|
||||||
|
# Provide a list of supported platforms, and for each platform a list of versions.
|
||||||
|
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
|
||||||
|
# To view available platforms and versions (or releases), visit:
|
||||||
|
# https://galaxy.ansible.com/api/v1/platforms/
|
||||||
|
#
|
||||||
|
# platforms:
|
||||||
|
# - name: Fedora
|
||||||
|
# versions:
|
||||||
|
# - all
|
||||||
|
# - 25
|
||||||
|
# - name: SomePlatform
|
||||||
|
# versions:
|
||||||
|
# - all
|
||||||
|
# - 1.0
|
||||||
|
# - 7
|
||||||
|
# - 99.99
|
||||||
|
|
||||||
|
galaxy_tags: []
|
||||||
|
# List tags for your role here, one per line. A tag is a keyword that describes
|
||||||
|
# and categorizes the role. Users find roles by searching for tags. Be sure to
|
||||||
|
# remove the '[]' above, if you add tags to this list.
|
||||||
|
#
|
||||||
|
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
|
||||||
|
# Maximum 20 tags per role.
|
||||||
|
|
||||||
|
dependencies: []
|
||||||
|
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
|
||||||
|
# if you add dependencies to this list.
|
||||||
|
|
||||||
6
tasks/cleanup.yml
Normal file
6
tasks/cleanup.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
- name: remove old cron entry
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/crontab
|
||||||
|
regexp: '.*/root/bin/borg.sh.*'
|
||||||
|
state: absent
|
||||||
32
tasks/cron.yml
Normal file
32
tasks/cron.yml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
- name: Deploy cronjob backup_temoin
|
||||||
|
vars:
|
||||||
|
minutes: "{{ 59 | random(seed=inventory_hostname) }}"
|
||||||
|
cron:
|
||||||
|
name: backup_temoin
|
||||||
|
cron_file: backup_temoin
|
||||||
|
user: root
|
||||||
|
hour: "7"
|
||||||
|
minute: "{{ minutes }}"
|
||||||
|
job: "/bin/touch /root/temoinbackup"
|
||||||
|
|
||||||
|
- name: Deploy cronjob backup_extract
|
||||||
|
vars:
|
||||||
|
minutes: "{{ 59 | random(seed=inventory_hostname) }}"
|
||||||
|
cron:
|
||||||
|
name: backup_extract
|
||||||
|
cron_file: backup_extract
|
||||||
|
user: root
|
||||||
|
hour: "8"
|
||||||
|
minute: "{{ minutes }}"
|
||||||
|
job: 'cd /tmp/ ; {{ borg_script_dir }}/borg.sh extract {{ ansible_hostname }}_$( date +\%Y\%m\%d) root/temoinbackup ; chmod 755 /tmp/root'
|
||||||
|
|
||||||
|
- name: Deploy cronjob backup_tout_court
|
||||||
|
vars:
|
||||||
|
minutes: "{{ 59 | random(seed=inventory_hostname) }}"
|
||||||
|
cron:
|
||||||
|
name: backup
|
||||||
|
cron_file: backup
|
||||||
|
user: root
|
||||||
|
hour: "2"
|
||||||
|
minute: "{{ minutes }}"
|
||||||
|
job: "{{ borg_script_dir }}/borg.sh"
|
||||||
28
tasks/install.yml
Normal file
28
tasks/install.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
- name: get borg binary
|
||||||
|
get_url:
|
||||||
|
dest: /usr/bin/borg
|
||||||
|
owner: root
|
||||||
|
group: backup
|
||||||
|
mode: "0750"
|
||||||
|
url: https://github.com/borgbackup/borg/releases/download/{{ borg_release }}/borg-linux64
|
||||||
|
|
||||||
|
- name: ensure /root/bin exists
|
||||||
|
file:
|
||||||
|
path: "{{ borg_script_dir }}"
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: get borgbackup script
|
||||||
|
tags: wip
|
||||||
|
get_url:
|
||||||
|
url: "{{ item.url }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
dest: "{{ borg_script_dir }}"
|
||||||
|
loop:
|
||||||
|
- { url: "https://git.hadoly.fr/CS_CT/borg/raw/tag/1.0/borg.sh", mode: "0700" }
|
||||||
|
|
||||||
|
- name: get borgbackup config
|
||||||
|
template:
|
||||||
|
src: borg.conf.jj
|
||||||
|
dest: "{{ borg_script_dir }}/borg.conf"
|
||||||
|
mode: 0600
|
||||||
6
tasks/main.yml
Normal file
6
tasks/main.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
# tasks file for borg_client
|
||||||
|
- include_tasks: cleanup.yml
|
||||||
|
- include_tasks: install.yml
|
||||||
|
- include_tasks: cron.yml
|
||||||
|
- include_tasks: repo.yml
|
||||||
39
tasks/repo.yml
Normal file
39
tasks/repo.yml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
# Here we mostly work on {{ borg_server }} to:
|
||||||
|
# * create repository
|
||||||
|
# * configure authorized key for backup user
|
||||||
|
- name: create root ssh private key
|
||||||
|
openssh_keypair:
|
||||||
|
comment: "passwordless access to vm2, as backup user"
|
||||||
|
path: /root/.ssh/id_rsa
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
|
||||||
|
- name: create repo
|
||||||
|
file:
|
||||||
|
path: "/var/backups/borg/{{ ansible_hostname }}"
|
||||||
|
state: directory
|
||||||
|
owner: backup
|
||||||
|
group: backup
|
||||||
|
delegate_to: "{{ borg_server }}"
|
||||||
|
|
||||||
|
- name: get public key
|
||||||
|
command: "cat /root/.ssh/id_rsa.pub"
|
||||||
|
register: pubkey
|
||||||
|
|
||||||
|
- name: set pubkey as variable
|
||||||
|
set_fact:
|
||||||
|
public_key: "{{ pubkey.stdout }}"
|
||||||
|
|
||||||
|
# can't use authorized_key module here
|
||||||
|
- name: install ssh key
|
||||||
|
lineinfile:
|
||||||
|
path: /var/backups/.ssh/authorized_keys
|
||||||
|
line: 'command="borg serve --restrict-to-path /var/backups/borg/" {{ public_key }} from {{ ansible_hostname }}'
|
||||||
|
create: true
|
||||||
|
owner: backup
|
||||||
|
group: backup
|
||||||
|
mode: 0600
|
||||||
|
delegate_to: "{{ borg_server }}"
|
||||||
|
|
||||||
|
|
||||||
5
templates/borg.conf.jj
Normal file
5
templates/borg.conf.jj
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
REPOSITORY={{ borg_account }}@{{ borg_server }}:{{ borg_remote_dir }}/{{ ansible_hostname }}
|
||||||
|
export BORG_PASSPHRASE={{ borg_passphrase }}
|
||||||
|
borg=/usr/bin/borg
|
||||||
|
rotate={{ borg_rotate }}
|
||||||
|
src="{{ borg_dirs }}"
|
||||||
2
tests/inventory
Normal file
2
tests/inventory
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
localhost
|
||||||
|
|
||||||
5
tests/test.yml
Normal file
5
tests/test.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- hosts: localhost
|
||||||
|
remote_user: root
|
||||||
|
roles:
|
||||||
|
- borg_client
|
||||||
2
vars/main.yml
Normal file
2
vars/main.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# vars file for borg_client
|
||||||
Reference in New Issue
Block a user