zrepl
This commit is contained in:
parent
79aaaf7498
commit
74600efb4c
47
ansible-playbooks/zrepl/zrepl.yml
Normal file
47
ansible-playbooks/zrepl/zrepl.yml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
- name: zrepl
|
||||||
|
hosts: nasgroup
|
||||||
|
tasks:
|
||||||
|
- name: 'apt: zrepl gpg'
|
||||||
|
ansible.builtin.get_url:
|
||||||
|
url: 'https://zrepl.cschwarz.com/apt/apt-key.asc'
|
||||||
|
dest: /usr/share/keyrings/zrepl.asc
|
||||||
|
- name: 'apt: zrepl repo'
|
||||||
|
apt_repository:
|
||||||
|
repo: 'deb [arch=amd64 signed-by=/usr/share/keyrings/zrepl.asc] https://zrepl.cschwarz.com/apt/debian bookworm main'
|
||||||
|
- name: 'apt: ensure packages'
|
||||||
|
apt:
|
||||||
|
state: latest
|
||||||
|
pkg: zrepl
|
||||||
|
|
||||||
|
- name: 'zrepl: ensure config'
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "zrepl_{{ansible_hostname}}.yml.j2"
|
||||||
|
dest: /etc/zrepl/zrepl.yml
|
||||||
|
mode: 600
|
||||||
|
register: zreplconf
|
||||||
|
- name: 'zrepl: restart service after config change'
|
||||||
|
when: zreplconf.changed
|
||||||
|
systemd_service:
|
||||||
|
state: restarted
|
||||||
|
enabled: true
|
||||||
|
name: zrepl
|
||||||
|
- name: 'zrepl: ensure service'
|
||||||
|
when: not zreplconf.changed
|
||||||
|
systemd_service:
|
||||||
|
state: started
|
||||||
|
enabled: true
|
||||||
|
name: zrepl
|
||||||
|
|
||||||
|
# avoid accidental conflicts of changes on recv (would err 'will not overwrite without force')
|
||||||
|
- name: 'zfs: ensure recv mountpoint=off'
|
||||||
|
hosts: offsite
|
||||||
|
tasks:
|
||||||
|
- name: 'zfs: get mountpoint'
|
||||||
|
shell: zfs get mountpoint -H -o value {{offsite_dataset}}
|
||||||
|
register: result
|
||||||
|
changed_when: false
|
||||||
|
- when: result.stdout != "none"
|
||||||
|
name: 'zfs: ensure mountpoint=off'
|
||||||
|
changed_when: true
|
||||||
|
shell: zfs set mountpoint=none {{offsite_dataset}}
|
||||||
|
register: result
|
47
ansible-playbooks/zrepl/zrepl_nas.yml.j2
Normal file
47
ansible-playbooks/zrepl/zrepl_nas.yml.j2
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
global:
|
||||||
|
logging:
|
||||||
|
- type: syslog
|
||||||
|
format: logfmt
|
||||||
|
level: warn
|
||||||
|
monitoring:
|
||||||
|
- type: prometheus
|
||||||
|
listen: ':9811'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- name: k6zrepl
|
||||||
|
type: snap
|
||||||
|
# "<" aka recursive, https://zrepl.github.io/configuration/filter_syntax.html
|
||||||
|
filesystems:
|
||||||
|
'nas<': true
|
||||||
|
snapshotting:
|
||||||
|
type: periodic
|
||||||
|
prefix: zrepl_
|
||||||
|
interval: 1h
|
||||||
|
pruning:
|
||||||
|
keep:
|
||||||
|
# Keep non-zrepl snapshots
|
||||||
|
- type: regex
|
||||||
|
negate: true
|
||||||
|
regex: '^zrepl_'
|
||||||
|
|
||||||
|
- type: last_n
|
||||||
|
regex: "^zrepl_.*"
|
||||||
|
count: 4
|
||||||
|
- type: grid
|
||||||
|
regex: "^zrepl_.*"
|
||||||
|
grid: 4x1h | 6x4h | 3x1d | 2x7d
|
||||||
|
|
||||||
|
- name: k6zrepl_offsite_src
|
||||||
|
type: source
|
||||||
|
send:
|
||||||
|
encrypted: true # zfs native already-encrypted, filesystems not encrypted will log to error-level
|
||||||
|
serve:
|
||||||
|
type: tcp
|
||||||
|
listen: "{{ansible_host}}:35566" # NAT-ed to 193.40.103.250
|
||||||
|
clients: {
|
||||||
|
"78.28.64.17": "offsite.k-space.ee",
|
||||||
|
}
|
||||||
|
filesystems:
|
||||||
|
'nas<': true
|
||||||
|
snapshotting: # handled by above job, separated for secuwurity (isolation of domains)
|
||||||
|
type: manual
|
38
ansible-playbooks/zrepl/zrepl_offsite.yml.j2
Normal file
38
ansible-playbooks/zrepl/zrepl_offsite.yml.j2
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
global:
|
||||||
|
logging:
|
||||||
|
- type: syslog
|
||||||
|
format: logfmt
|
||||||
|
level: warn
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- name: k6zrepl_offsite_dest
|
||||||
|
type: pull
|
||||||
|
recv:
|
||||||
|
placeholder:
|
||||||
|
encryption: off # https://zrepl.github.io/configuration/sendrecvoptions.html#placeholders
|
||||||
|
# bandwidth_limit:
|
||||||
|
# max: 9 MiB # 75.5 Mbps
|
||||||
|
connect:
|
||||||
|
type: tcp
|
||||||
|
address: '193.40.103.250:35566' # firewall whitelisted to offsite
|
||||||
|
root_fs: {{offsite_dataset}}
|
||||||
|
interval: 10m # start interval, does nothing when no snapshots to recv
|
||||||
|
replication:
|
||||||
|
concurrency:
|
||||||
|
steps: 2
|
||||||
|
pruning:
|
||||||
|
keep_sender: # offsite does not dictate nas snapshot policy
|
||||||
|
- type: regex
|
||||||
|
regex: '.*'
|
||||||
|
keep_receiver:
|
||||||
|
# Keep non-zrepl snapshots
|
||||||
|
- negate: true
|
||||||
|
type: regex
|
||||||
|
regex: "^zrepl_"
|
||||||
|
|
||||||
|
- type: last_n
|
||||||
|
regex: "^zrepl_"
|
||||||
|
count: 4
|
||||||
|
- type: grid
|
||||||
|
regex: "^zrepl_"
|
||||||
|
grid: 4x1h | 6x4h | 3x1d | 2x7d
|
@ -5,12 +5,21 @@ all:
|
|||||||
- eaas
|
- eaas
|
||||||
extra_admins: []
|
extra_admins: []
|
||||||
children:
|
children:
|
||||||
|
nasgroup:
|
||||||
|
hosts:
|
||||||
|
nas.k-space.ee:
|
||||||
|
ansible_host: 172.23.0.7
|
||||||
|
offsite:
|
||||||
|
ansible_host: 78.28.64.17
|
||||||
|
ansible_port: 10648
|
||||||
|
vars:
|
||||||
|
offsite_dataset: offsite/backup_zrepl
|
||||||
misc:
|
misc:
|
||||||
|
children:
|
||||||
|
nasgroup:
|
||||||
hosts:
|
hosts:
|
||||||
ns1.k-space.ee:
|
ns1.k-space.ee:
|
||||||
ansible_host: 172.20.0.2
|
ansible_host: 172.20.0.2
|
||||||
nas.k-space.ee:
|
|
||||||
ansible_host: 172.23.0.7
|
|
||||||
proxmox:
|
proxmox:
|
||||||
vars:
|
vars:
|
||||||
extra_admins:
|
extra_admins:
|
||||||
|
Loading…
Reference in New Issue
Block a user