aboutsummaryrefslogtreecommitdiffstats
path: root/tasks/client_setup.yml
blob: d3e9f75b01ae1c08a87daa5c11c0119aad17d4e0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
---
- name: Create SSH Directory
  ansible.builtin.file:
    path: /root/.ssh
    owner: root
    group: root
    mode: '0640'
    state: directory
  become: true

- name: Add borg server to known_hosts
  ansible.builtin.known_hosts:
    name: '{{ borg_server_host_url }}'
    key: '{{ borg_server_host_url }} {{ borg_server_host_ssh_key }}'
    path: /root/.ssh/known_hosts
    state: present
  become: true

- name: Generate SSH keys
  community.crypto.openssh_keypair:
    path: /root/.ssh/id_rsa
    owner: root
    group: root
    mode: '0600'
    comment: root@{{ inventory_hostname }}
  become: true
  register: ssh_key

- name: Deploy Keys to Borg server
  ansible.builtin.lineinfile:
    path: '{{ borg_server_user_home }}/.ssh/authorized_keys'
    line: >
      restrict,command="borg serve
      {{ "--append-only" if borg_mode_append_only }}
      --restrict-to-repository {{ borg_repo_name }}"
      {{ ssh_key.public_key }} root@{{ inventory_hostname }}
    search_string: '{{ ssh_key.public_key }}'
    state: present
  become: true
  delegate_to: '{{ borg_server_host }}'

- name: Initialise Borg repository
  ansible.builtin.command: >
    borg init --encryption=repokey
    borg@{{ borg_server_host_url }}:{{ borg_server_user_home }}/{{ borg_repo_name }}
  environment:
    BORG_PASSPHRASE: '{{ borg_passphrase }}'
  become: true
  register: init_borg_output
  changed_when: init_borg_output.rc != 2
  failed_when:
    - init_borg_output.rc != 2
    - init_borg_output.rc != 0

- name: Make sure key file exists
  ansible.builtin.file:
    path: '{{ borg_decryption_keys_yaml_path }}'
    state: touch
    mode: '0600'
    access_time: preserve
    modification_time: preserve
  delegate_to: localhost
  become: false

- name: Read Vars file
  ansible.builtin.include_vars:
    file: '{{ borg_decryption_keys_yaml_path }}'
  register: local

- name: Add repository encryption keys to ansible repo
  when: not inventory_hostname in local.ansible_facts
  throttle: 1
  block:
    - name: If host new read encryption keys
      ansible.builtin.command: >
        borg key export --paper
        borg@{{ borg_server_host_url }}:{{ borg_server_user_home }}/{{ borg_repo_name }}
      become: true
      register: borg_keys
      changed_when: borg_keys.rc != 0

    - name: If host new add encryption keys to vars
      ansible.builtin.set_fact:
        decryption_keys: '{{ local.ansible_facts | combine({inventory_hostname: borg_keys.stdout}) }}'

- name: Update encryption vars
  ansible.builtin.copy:
    content: '{{ decryption_keys | to_nice_yaml(indent=2, width=2048) }}'
    dest: '{{ borg_decryption_keys_yaml_path }}'
    mode: '0600'
  when: decryption_keys is defined
  delegate_to: localhost
  become: false

- name: Set up env for cron job
  ansible.builtin.cron:
    name: BORG_PASSPHRASE
    job: '{{ borg_passphrase }}'
    state: '{{ "present" if (borg_included_dirs | length > 0) else "absent" }}'
    env: true
    user: root
  become: true

- name: Set up backup cron jobs
  ansible.builtin.cron:
    name: BORG (Application level backups)
    job: >
      borg create -C {{ borg_compression }}
      borg@{{ borg_server_host_url }}:{{ borg_server_user_home }}/{{ borg_repo_name }}::{{ borg_backup_name_format }}
      {{ borg_included_dirs | map('quote') | join(' ') }}
      {% for e in (borg_excluded_dirs | map('quote')) %} --exclude {{ e }} {% endfor %}
    user: root
    state: '{{ "present" if (borg_included_dirs | length > 0) else "absent" }}'
    minute: '{{ borg_cron_time.minute | default(omit) }}'
    hour: '{{ borg_cron_time.hour | default(omit) }}'
    weekday: '{{ borg_cron_time.weekday | default(omit) }}'
    day: '{{ borg_cron_time.day | default(omit) }}'
    month: '{{ borg_cron_time.month | default(omit) }}'
    special_time: '{{ borg_cron_time.special_time | default(omit) }}'
  become: true