Skip to content
This repository was archived by the owner on Oct 8, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
# We assume it's safe to only go back 50 build back.
- name: Delete mysql dumps.
file:
ansible.builtin.file:
path: "{{ mysql_backup.dumps_directory }}/{{ _mysql_host }}/{{ database.database }}-{{ item }}.sql.bz2"
state: absent
with_sequence: start={{ [previous_build_number | int - 50, 0] | max }} end={{ [previous_build_number | int - mysql_backup.keep, 0] | max }}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
# We assume it's safe to only go back 50 build back.
- name: Delete mysql databases.
mysql_db:
community.mysql.mysql_db:
name: "{{ database.database }}_{{ item }}"
state: absent
login_host: "{{ _mysql_host }}"
Expand Down
12 changes: 6 additions & 6 deletions roles/database_backup/database_backup-mysql/tasks/cleanup.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
---
- name: Grab mysql credentials.
fetch:
ansible.builtin.fetch:
src: "{{ database.credentials_file }}"
dest: "{{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini"
flat: true

# Credentials for "managing" databases.
- set_fact:
- ansible.builtin.set_fact:
_mysql_host: "{{ lookup('ini', 'host section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_user: "{{ lookup('ini', 'user section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_password: "{{ lookup('ini', 'password section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"

- include_tasks: "cleanup-{{ mysql_backup.handling }}.yml"
- ansible.builtin.include_tasks: "cleanup-{{ mysql_backup.handling }}.yml"

# We assume it's safe to only go back 50 build back.
- name: Delete mysql users.
mysql_user:
community.mysql.mysql_user:
name: "{{ database.user }}_{{ item }}"
host_all: true
state: absent
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_database_name: "{{ database.database }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_previous_build_database_name: "{{ database.database }}"

- name: Create initial database.
mysql_db:
community.mysql.mysql_db:
name: "{{ _mysql_build_database_name }}"
state: present
login_host: "{{ _mysql_host }}"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
---
# Setup database names.
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_database_name: "{{ database.database }}_{{ build_number }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_previous_build_database_name: "{{ database.database }}_{{ previous_build_number }}"
# Note: we don't use the mysql_db Ansible module on purpose.
# If database already exists, we want to fail and not override it
# with previous build.
- name: Create new database.
command: mysql --defaults-extra-file={{ database.credentials_file }} -e "CREATE DATABASE {{ _mysql_build_database_name }};"
ansible.builtin.command: mysql --defaults-extra-file={{ database.credentials_file }} -e "CREATE DATABASE {{ _mysql_build_database_name }};"
run_once: true

- name: Populate new database.
shell: "mysqldump --defaults-extra-file={{ database.credentials_file }} {{ mysql_backup.mysqldump_params }} {{ _mysql_previous_build_database_name }} | mysql --defaults-extra-file={{ database.credentials_file }} {{ _mysql_build_database_name }}"
ansible.builtin.shell: "mysqldump --defaults-extra-file={{ database.credentials_file }} {{ mysql_backup.mysqldump_params }} {{ _mysql_previous_build_database_name }} | mysql --defaults-extra-file={{ database.credentials_file }} {{ _mysql_build_database_name }}"
when: previous_build_number > 0
run_once: true
28 changes: 14 additions & 14 deletions roles/database_backup/database_backup-mysql/tasks/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
---
- name: Grab mysql credentials.
fetch:
ansible.builtin.fetch:
src: "{{ database.credentials_file }}"
dest: "{{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini"
flat: true

# Credentials for "managing" databases.
- set_fact:
- ansible.builtin.set_fact:
_mysql_host: "{{ lookup('ini', 'host section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_user: "{{ lookup('ini', 'user section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_password: "{{ lookup('ini', 'password section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
# Credentials for the app itself.
# Manual: reuse given creds. Note the user gets ignored.
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_user_name: "{{ _mysql_user }}"
when: mysql_backup.credentials_handling == 'manual'
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_password: "{{ _mysql_password }}"
when: mysql_backup.credentials_handling == 'manual'
# Static: create/update user/pwd only once.
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_user_name: "{{ database.user }}"
when: mysql_backup.credentials_handling == 'static'

Expand Down Expand Up @@ -71,36 +71,36 @@
- _legacy_static_creds.stat.exists
### End of legacy handling.

- set_fact:
- ansible.builtin.set_fact:
_mysql_build_password: "{{ lookup('password', '{{ _ce_deploy_data_dir }}/{{ project_name }}_{{ build_type }}/mysql/{{ _mysql_host }}/{{ database.database }}') }}"
when: mysql_backup.credentials_handling == 'static'
# Rotate: create user/pwd on each build.
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_user_name: "{{ database.user }}_{{ build_number }}"
when: mysql_backup.credentials_handling == 'rotate'
- set_fact:
- ansible.builtin.set_fact:
_mysql_build_password: "{{ lookup('password', '/dev/shm/{{ project_name }}_{{ build_type }}_{{ build_number }}') }}"
when: mysql_backup.credentials_handling == 'rotate'

- include_tasks: "deploy-{{ mysql_backup.handling }}.yml"
- ansible.builtin.include_tasks: "deploy-{{ mysql_backup.handling }}.yml"

# We append privileges instead of replacing,
# to allow this role to be looped over,
# for multisites or projects with multiple databases.
# @see https://www.thesysadmin.rocks/2020/10/08/rds-mariadb-grant-all-permission-access-denied-for-user/ for why we cannot GRANT ALL.
# As of MySQL 8.0 the GRANT operation has no password option, you must CREATE your user first.
- name: Create/update mysql user.
command: mysql --defaults-extra-file={{ database.credentials_file }} -e "CREATE USER IF NOT EXISTS '{{ _mysql_build_user_name }}'@'%' IDENTIFIED BY '{{ _mysql_build_password }}'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON {{ _mysql_build_database_name }}.* TO '{{ _mysql_build_user_name }}'@'%';"
ansible.builtin.command: mysql --defaults-extra-file={{ database.credentials_file }} -e "CREATE USER IF NOT EXISTS '{{ _mysql_build_user_name }}'@'%' IDENTIFIED BY '{{ _mysql_build_password }}'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON {{ _mysql_build_database_name }}.* TO '{{ _mysql_build_user_name }}'@'%';"
when: ( mysql_backup.credentials_handling == 'rotate' ) or ( mysql_backup.credentials_handling == 'static' )
run_once: true

- set_fact:
- ansible.builtin.set_fact:
_build_database:
original: "{{ database }}"
name: "{{ _mysql_build_database_name }}"
user: "{{ _mysql_build_user_name }}"
password: "{{ _mysql_build_password }}"
host: "{{ _mysql_host }}"

- set_fact:
- ansible.builtin.set_fact:
build_databases: "{{ build_databases + [ _build_database ] }}"
2 changes: 1 addition & 1 deletion roles/database_backup/database_backup-mysql/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
- name: Take database backup.
include_tasks: "{{ deploy_operation }}.yml"
ansible.builtin.include_tasks: "{{ deploy_operation }}.yml"
with_items: "{{ mysql_backup.databases }}"
loop_control:
loop_var: database
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
- name: Revert database from dump.
shell: "bzcat {{ mysql_backup.dumps_directory }}/{{ _mysql_host }}/{{ database.database }}-{{ previous_build_number }}.sql.bz2 | mysql --defaults-extra-file={{ database.credentials_file }} {{ database.database }}"
ansible.builtin.shell: "bzcat {{ mysql_backup.dumps_directory }}/{{ _mysql_host }}/{{ database.database }}-{{ previous_build_number }}.sql.bz2 | mysql --defaults-extra-file={{ database.credentials_file }} {{ database.database }}"
when: previous_build_number > 0
run_once: true
14 changes: 8 additions & 6 deletions roles/database_backup/database_backup-mysql/tasks/revert.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
---
- name: Grab mysql credentials.
fetch:
ansible.builtin.fetch:
src: "{{ database.credentials_file }}"
dest: "{{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini"
flat: true

# Credentials for "managing" databases.
- set_fact:
- ansible.builtin.set_fact:
_mysql_host: "{{ lookup('ini', 'host section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_user: "{{ lookup('ini', 'user section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"
- set_fact:
- ansible.builtin.set_fact:
_mysql_password: "{{ lookup('ini', 'password section=client file={{ _ce_deploy_build_dir }}/mysql_backup_credentials.ini') }}"

- include_tasks: "revert-{{ mysql_backup.handling }}.yml"
when: previous_build_number > 0
- ansible.builtin.include_tasks: "revert-{{ mysql_backup.handling }}.yml"
when:
- previous_build_number > 0
- database_backup.revert
1 change: 1 addition & 0 deletions roles/database_backup/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
database_backup:
engines:
- mysql
revert: true
4 changes: 2 additions & 2 deletions roles/database_backup/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
- set_fact:
- ansible.builtin.set_fact:
build_databases: []

- name: Take database dumps.
include_role:
ansible.builtin.include_role:
name: "database_backup/database_backup-{{ engine }}"
with_items: "{{ database_backup.engines }}"
loop_control:
Expand Down