feat(kopia): add restore procedure

This commit is contained in:
il
2026-06-24 18:48:00 +09:00
parent 278054a65f
commit 47d437375b
3 changed files with 98 additions and 18 deletions
+16 -8
View File
@@ -138,14 +138,6 @@
tags: ["init", "nftables"]
tags: ["init", "nftables"]
- name: Set crowdsec
ansible.builtin.include_role:
name: "common"
tasks_from: "services/set_crowdsec"
apply:
tags: ["site", "crowdsec"]
tags: ["site", "crowdsec"]
- name: Set alloy
ansible.builtin.include_role:
name: "common"
@@ -154,6 +146,14 @@
tags: ["init", "alloy"]
tags: ["init", "alloy"]
- name: Set crowdsec
ansible.builtin.include_role:
name: "common"
tasks_from: "services/set_crowdsec"
apply:
tags: ["site", "crowdsec"]
tags: ["site", "crowdsec"]
- name: Set kopia
ansible.builtin.include_role:
name: "common"
@@ -258,6 +258,14 @@
tags: ["site", "homebox"]
tags: ["site", "homebox"]
- name: Set homepage
ansible.builtin.include_role:
name: "app"
tasks_from: "services/set_homepage"
apply:
tags: ["site", "homepage"]
tags: ["site", "homepage"]
- name: Flush handlers right now
ansible.builtin.meta: "flush_handlers"
+8 -8
View File
@@ -138,6 +138,14 @@
tags: ["site", "crowdsec"]
tags: ["site", "crowdsec"]
- name: Set kopia
ansible.builtin.include_role:
name: "common"
tasks_from: "services/set_kopia"
apply:
tags: ["site", "kopia"]
tags: ["site", "kopia"]
- name: Set ca
ansible.builtin.include_role:
name: "infra"
@@ -209,11 +217,3 @@
apply:
tags: ["site", "grafana"]
tags: ["site", "grafana"]
- name: Set kopia
ansible.builtin.include_role:
name: "common"
tasks_from: "services/set_kopia"
apply:
tags: ["site", "kopia"]
tags: ["site", "kopia"]
@@ -365,6 +365,78 @@
become: true
no_log: true
- name: Check data directory empty
ansible.builtin.find:
path: "{{ node['home_path'] }}/data/"
file_type: "any"
hidden: true
recurse: false
register: "is_data_dir_empty"
- name: Connect kopia server
environment:
KOPIA_PASSWORD: "{{ hostvars['console']['kopia']['users'][node['name']] }}"
ansible.builtin.shell: |
/usr/bin/kopia repository connect server \
--url=https://{{ services['kopia']['domain']['internal'] }}.{{ domain['internal'] }}:443 \
--override-username={{ node['name'] }} \
--override-hostname={{ node['name'] }}.{{ domain['internal'] }}
become: true
when: is_data_dir_empty.matched == 0
changed_when: false
failed_when: is_kopia_connected.rc != 0
register: "is_kopia_connected"
no_log: true
- name: Check whether Kopia snapshot exists
environment:
KOPIA_PASSWORD: "{{ hostvars['console']['kopia']['users'][node['name']] }}"
ansible.builtin.shell: |
/usr/bin/kopia snapshot list \
{{ node['name'] }}@{{ node['name'] }}.{{ domain['internal'] }}:{{ node['home_path'] }}/data \
--json \
--max-results=1
become: true
when: (is_kopia_connected.rc | default(1)) == 0
changed_when: false
failed_when: false
register: "is_snapshot_exist"
no_log: true
- name: Restore data directory
environment:
KOPIA_PASSWORD: "{{ hostvars['console']['kopia']['users'][node['name']] }}"
ansible.builtin.shell: |
/usr/bin/kopia snapshot restore \
--snapshot-time=latest \
{{ node['name'] }}@{{ node['name'] }}.{{ domain['internal'] }}:{{ node['home_path'] }}/data \
{{ node['home_path'] }}/data
become: true
when:
- is_data_dir_empty.matched == 0
- (is_kopia_connected.rc | default(1)) == 0
- (is_snapshot_exist.stdout |
default('[]', true) |
from_json |
list |
length
) > 0
changed_when: is_kopia_restored.rc == 0
failed_when: is_kopia_restored.rc != 0
register: "is_kopia_restored"
no_log: true
- name: Disconnect kopia server
ansible.builtin.shell: |
/usr/bin/kopia repository disconnect
become: true
when:
- is_data_dir_empty.matched == 0
- (is_kopia_connected.rc | default(1)) == 0
changed_when: false
failed_when: false
no_log: true
- name: Deploy kopia backup service files
ansible.builtin.template:
src: "{{ hostvars['console']['node']['config_path'] }}/services/systemd/common/kopia/{{ item }}.j2"
@@ -421,8 +493,8 @@
ansible.builtin.shell: |
/usr/bin/kopia repository connect server \
--url=https://{{ services['kopia']['domain']['internal'] }}.{{ domain['internal'] }}:443 \
--override-username=console \
--override-hostname=console.{{ domain['internal'] }}
--override-username={{ node['name'] }} \
--override-hostname={{ node['name'] }}.{{ domain['internal'] }}
changed_when: false
failed_when: is_kopia_connected.rc != 0
register: "is_kopia_connected"