--- # This playbook backups the odroid docker containers. - name: Backup odroid hosts: all become: false gather_facts: true tasks: - include_vars: vars/secret.yaml - include_vars: vars/variable.yaml - name: Check if directories exist stat: path: "{{ backup_dir }}/{{ item }}" register: dirs loop: "{{ systems }}" - name: Create not existing directories file: path: "{{ backup_dir }}/{{ item.item }}" state: directory mode: 0755 group: chris owner: chris when: item.stat.exists == false with_items: "{{ dirs.results }}" loop_control: label: "{{ item.item }}" - name: Backup mysql databases shell: docker exec mysql8 mysqldump -u{{ mysql_user }} -p{{ mysql_password }} {{ item }} > {{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql loop: "{{ mysql_databases }}" - name: Backup postgres databases shell: docker exec psql14 pg_dump -U {{ postgres_user }} {{ item }} > {{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql loop: "{{ postgres_databases }}" - name: Compress database backup files shell: gzip {{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql loop: "{{ databases }}" - name: Check logrotate directories stat: path: "{{ backup_dir }}/{{ item[0] }}/{{ item[1] }}" register: subdirs with_nested: - "{{ systems }}" - ['daily', 'weekly', 'monthly', 'yearly'] loop_control: label: "{{ item[0] }} {{ item[1] }}" - name: Create not existing logrotate directories file: path: "{{ backup_dir }}/{{ item.item[0] }}/{{ item.item[1] }}" state: directory mode: 0755 group: chris owner: chris when: item.stat.exists == false with_items: "{{ subdirs.results }}" loop_control: label: "{{ item.item[0] }} {{ item.item[1] }}" - name: Store the yearly backups copy: remote_src: true src: "{{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" dest: "{{ backup_dir }}/{{ item }}/yearly/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" loop: "{{ databases }}" when: (ansible_date_time.day == "01" and ansible_data_time.month == "01") - name: Store the monthly backups copy: remote_src: true src: "{{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" dest: "{{ backup_dir }}/{{ item }}/monthly/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" loop: "{{ databases }}" when: (ansible_date_time.day == "01" and ansible_data_time.month != "01") - name: Store the weekly backups copy: remote_src: true src: "{{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" dest: "{{ backup_dir }}/{{ item }}/weekly/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" loop: "{{ databases }}" when: (ansible_date_time.weekday_number == "7") - name: Store the daily backups copy: remote_src: true src: "{{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" dest: "{{ backup_dir }}/{{ item }}/daily/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" loop: "{{ databases }}" when: (ansible_date_time.weekday_number != "7" and ansible_date_time.day != "01") - name: Cleanup original backup files file: path: "{{ backup_dir }}/{{ item }}/{{ ansible_date_time.iso8601_basic_short }}.sql.gz" state: absent loop: "{{ databases }}" - name: Find old daily backups find: paths: "{{ backup_dir }}/{{ item }}/daily" file_type: file age: 8d age_stamp: ctime patterns: '*.sql.gz' recurse: false register: oldBackups loop: "{{ databases }}" - name: Delete old daily backups file: path: "{{ item.path }}" state: absent with_items: "{{ oldBackups.results | map(attribute='files') | list }}" loop_control: label: "{{ item.path }}" - name: Find old weekly backups find: paths: "{{ backup_dir }}/{{ item }}/weekly" file_type: file age: 5w age_stamp: ctime patterns: '*.sql.gz' recurse: false register: oldBackups loop: "{{ databases }}" - name: Delete old weekly backups file: path: "{{ item.path }}" state: absent with_items: "{{ oldBackups.results | map(attribute='files') | list }}" loop_control: label: "{{ item.path }}" - name: Find old monthly backups find: paths: "{{ backup_dir }}/{{ item }}/monthly" file_type: file age: 56w age_stamp: ctime patterns: '*.sql.gz' recurse: false register: oldBackups loop: "{{ databases }}" - name: Delete old monthly backups file: path: "{{ item.path }}" state: absent with_items: "{{ oldBackups.results | map(attribute='files') | list }}" loop_control: label: "{{ item.path }}"