Playbooks to a new Lilik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.6 KiB

  1. ---
  2. - name: 'install borg'
  3. apt:
  4. pkg: 'borgbackup'
  5. state: 'latest'
  6. update_cache: true
  7. cache_valid_time: 3600
  8. - name: 'create .ssh folder'
  9. file:
  10. path: '/root/.ssh'
  11. mode: '0700'
  12. state: 'directory'
  13. - name: 'create backup keypair'
  14. openssh_keypair:
  15. path: '/root/.ssh/id_ed25519_BORG'
  16. force: '{{ borgrepo_force_new_key }}'
  17. type: 'ed25519'
  18. comment: 'backup@{{ host_fqdn }}'
  19. register: ssh_keypair
  20. - name: 'create host repos namespace'
  21. file:
  22. path: '/home/borg/repos/{{ host_fqdn }}'
  23. owner: 'borg'
  24. group: 'borg'
  25. mode: '0700'
  26. state: 'directory'
  27. delegate_to: '{{ item.ansible_host }}'
  28. loop: '{{ borgrepo_servers }}'
  29. - name: 'authorize host key'
  30. lineinfile:
  31. path: '/home/borg/.ssh/authorized_keys'
  32. owner: 'borg'
  33. group: 'borg'
  34. mode: '0600'
  35. create: yes
  36. line: >-
  37. command="cd {{ repodir }}; borg serve --append-only --restrict-to-path {{ repodir }}",restrict
  38. {{ ssh_keypair.public_key }}
  39. regexp: '{{ ssh_keypair.comment }}$'
  40. state: 'present'
  41. vars:
  42. repodir: '/home/borg/repos/{{ host_fqdn }}'
  43. delegate_to: '{{ item.ansible_host }}'
  44. loop: '{{ borgrepo_servers }}'
  45. - name: 'upload host ssh ca'
  46. copy:
  47. content: |
  48. {% for ca in ssh_server_ca %}
  49. @cert-authority *.dmz.{{ domain }} {{ ca }}
  50. {% endfor %}
  51. dest: '/root/.ssh/known_hosts'
  52. mode: '0600'
  53. ##ToDo setup encryption
  54. - name: 'initialize repo'
  55. shell:
  56. cmd: >
  57. borg init -e {{ item[1].encryption }} borg@{{ item[1].ansible_host }}.dmz.{{ domain }}:{{ item[0].key }}
  58. register: borgrepo_init_cmd
  59. failed_when:
  60. - borgrepo_init_cmd.rc != 0
  61. - borgrepo_init_cmd.stderr !='A repository already exists at borg@'+item[1].ansible_host+'.dmz.'+domain+':'+item[0].key+'.'
  62. changed_when: borgrepo_init_cmd.rc == 0
  63. environment:
  64. BORG_RSH: 'ssh -i /root/.ssh/id_ed25519_BORG'
  65. BORG_PASSPHRASE: '{{ item[1].encryption_passphrase | d("") }}'
  66. loop: '{{ borgrepo_repos|dict2items | product(borgrepo_servers) | list }}'
  67. - name: 'create backup directory'
  68. file:
  69. path: '/etc/backup'
  70. state: 'directory'
  71. owner: 'root'
  72. group: 'root'
  73. mode: '0700'
  74. - name: 'create log backup directory'
  75. file:
  76. path: '/var/log/backup-status'
  77. state: 'directory'
  78. owner: 'root'
  79. group: 'root'
  80. mode: '0755'
  81. - name: 'create repo log directory'
  82. file:
  83. path: '/var/log/backup-status/{{ item[0].key }}.{{ item[1].ansible_host }}'
  84. state: 'directory'
  85. owner: 'root'
  86. group: 'root'
  87. mode: '0755'
  88. loop: '{{ borgrepo_repos|dict2items | product(borgrepo_servers) | list}}'
  89. - name: 'create backup scripts'
  90. template:
  91. src: 'backupscript.sh.j2'
  92. dest: '/etc/backup/{{ item[0].key }}.{{ item[1].ansible_host }}.sh'
  93. owner: 'root'
  94. group: 'root'
  95. mode: '0700'
  96. loop: '{{ borgrepo_repos|dict2items | product(borgrepo_servers) | list}}'
  97. - name: 'create systemd service'
  98. template:
  99. src: 'backupservice.service'
  100. dest: '/etc/systemd/system/borg-backup@.service'
  101. notify: reload systemd
  102. - name: 'create systemd timers'
  103. copy:
  104. content: |
  105. [Unit]
  106. Description=BorgBackup %I repo timer.
  107. [Timer]
  108. WakeSystem=false
  109. OnCalendar=*-*-* 02:00:00
  110. RandomizedDelaySec=20min
  111. [Install]
  112. WantedBy=timers.target
  113. dest: '/etc/systemd/system/borg-backup@.timer'
  114. notify: reload systemd
  115. - name: 'enable systemd timers'
  116. systemd:
  117. name: 'borg-backup@{{ item[0].key }}.{{ item[1].ansible_host }}.timer'
  118. daemon_reload: true
  119. enabled: true
  120. state: 'restarted'
  121. loop: '{{ borgrepo_repos|dict2items | product(borgrepo_servers) | list }}'
  122. - name: 'MONITORING | create entry'
  123. set_fact:
  124. borg_monitoring_repos: >
  125. {{ borg_monitoring_repos|d({})|combine({
  126. item[0].key+"."+item[1].ansible_host:
  127. {
  128. "backup_wage": item[0].value.interval|d(86400)|int,
  129. "backup_cage": (item[0].value.interval|d(86400)|int+7200)*2
  130. }
  131. }) }}
  132. loop: '{{ borgrepo_repos|dict2items | product(borgrepo_servers) | list }}'
  133. tags:
  134. - 'monitoring'
  135. - name: 'MONITORING | update facts'
  136. set_fact:
  137. monitoring_facts: >
  138. {{ hostvars[monitoring_host]["monitoring_facts"]
  139. | default({})
  140. | combine({
  141. host_fqdn:
  142. {
  143. "address": ansible_host,
  144. "borg_repos": borg_monitoring_repos
  145. }
  146. }, recursive=True) }}
  147. delegate_to: '{{ monitoring_host }}'
  148. delegate_facts: true
  149. tags:
  150. - 'monitoring'
  151. ...