diff --git a/roles/mysql/tasks/main.yml b/roles/mysql/tasks/main.yml index 4a2676ea6..0ae048ae1 100644 --- a/roles/mysql/tasks/main.yml +++ b/roles/mysql/tasks/main.yml @@ -1,186 +1,188 @@ --- -- name: "Message for non redhat family servers" - when: ansible_facts['os_family'] != 'RedHat' - ansible.builtin.fail: - msg: "Sorry, this role only works on RedHat family servers" - -- name: "Install and configure mongo on redhat family servers" +- name: "Fix distro name for repo base url" + ansible.builtin.set_fact: + ansible_distribution: "rockylinux" + when: ansible_distribution == "Rocky" + +- name: "Add MariaDB.org repository" + ansible.builtin.template: + src: "mariadb.repo.j2" + dest: "/etc/yum.repos.d/mariadb.repo" + mode: "0644" + when: ansible_facts['os_family'] == 'RedHat' + +- name: "Add MariaDB repository" + ansible.builtin.template: + src: "mariadb.sources.j2" + dest: "/etc/apt/sources.list.d/mariadb.sources" + mode: "0644" + when: ansible_facts['os_family'] == 'Debian' + +- name: "Install mariadb packages" + ansible.builtin.package: + name: + - "MariaDB-server" + - "MariaDB-client" + - "{{ mariadb_python_mysql_version }}" + state: "present" + when: ansible_facts['os_family'] == 'RedHat' + +- name: "Install mariadb packages" + ansible.builtin.package: + name: + - "mariadb-server" + - "mariadb-client" + - "{{ mariadb_python_mysql_version | lower }}" + state: "present" + when: ansible_facts['os_family'] == 'Debian' + +- name: "Start and enable mariadb" + ansible.builtin.service: + name: "mariadb" + state: "started" + enabled: true + +- name: "Set mysql root password for all root accounts" + community.mysql.mysql_user: + name: "root" + password: "{{ mysql_root_password }}" + priv: "*.*:ALL,GRANT" + login_unix_socket: >- + {{ + '/run/mysqld/mysqld.sock' + if ansible_facts.os_family == 'Debian' + else '/var/lib/mysql/mysql.sock' + }} + +- name: "MySQL my.cnf" + ansible.builtin.template: + src: "my.cnf.j2" + dest: "/root/.my.cnf" + mode: "0600" + owner: "root" + group: "root" + +- name: "Delete anonymous MySQL server user" + community.mysql.mysql_user: + name: "" + state: "absent" + login_user: "root" + host: "{{ mariadb_host }}" + login_password: "{{ mysql_root_password }}" + +- name: "Delete anonymous MySQL server user for localhost" + community.mysql.mysql_user: + name: "" + state: "absent" + login_user: "root" + host: "{{ mariadb_host }}" + login_password: "{{ mysql_root_password }}" + +- name: "Delete test MySQL server user" + community.mysql.mysql_user: + name: "{{ item }}" + state: "absent" + login_user: "root" + login_password: "{{ mysql_root_password }}" + with_items: + - "test" + - "test_%" + +- name: "Delete anonymous MySQL server user for localhost" + community.mysql.mysql_user: + name: "" + state: "absent" + login_user: "root" + login_password: "{{ mysql_root_password }}" + +- name: "Remove the MySQL test database" + community.mysql.mysql_db: + db: "test" + state: "absent" + login_user: "root" + login_password: "{{ mysql_root_password }}" + +- name: "Create databases" + community.mysql.mysql_db: + name: "{{ item }}" + state: "present" + with_items: + - "{{ databases.names }}" + +- name: "Create database users" + community.mysql.mysql_user: + name: "{{ item[0].name }}" + host: "{{ item[0].hosts | join(',') if item[0].hosts is defined and (item[0].hosts | length>0) else item[1] }}" + password: "{{ item[0].password }}" + priv: "{{ item[0].db_name }}.*:ALL" + state: "present" + append_privs: true + no_log: true + with_nested: + - "{{ databases.users }}" + - "{{ database_clients }}" + +- name: "Create development database users" + community.mysql.mysql_user: + name: "{{ item.name}}" + host: "%" + password: "{{ item.password }}" + priv: "*.*:ALL" + state: "present" + no_log: true + with_items: + - "{{ databases.development_user|default([]) }}" + when: + - develop | bool + +- name: "Allow external connections when in development" + ansible.builtin.lineinfile: + dest: "/etc/my.cnf.d/server.cnf" + insertafter: '\\[mysqld\\]' + state: "present" + line: "bind-address=0.0.0.0" + when: + - develop | bool + +# Add backup user +- name: "Add mariadb backup user" + community.mysql.mysql_user: + name: "{{ mysql_backup_user }}" + password: "{{ mysql_backup_password }}" + login_user: "root" + login_password: "{{ mysql_root_password }}" + priv: "*.*:SELECT,LOCK TABLES,SHOW VIEW" + state: "present" + no_log: true + when: + - backup_node | bool + +- name: "Create the backup directory" + ansible.builtin.file: + path: "/home/backup" + state: "directory" + owner: "root" + group: "root" + mode: "0700" + when: + - backup_node | bool + +- name: "Put mariadb_backup script" + ansible.builtin.template: + src: "mariadb_backup.sh.j2" + dest: "/usr/local/sbin/mariadb_backup.sh" + mode: "0700" + owner: "root" + when: + - backup_node | bool + +- name: "Create cron symlink for backup script" + # todo: use cron task + ansible.builtin.file: + src: "/usr/local/sbin/mariadb_backup.sh" + dest: "/etc/cron.daily/db_backup" + state: "link" + mode: "0700" + owner: "root" when: - - ansible_facts['os_family'] == 'RedHat' - block: - # Add MariaDB repo and key - - - name: "Fix distro name for repo base url" - ansible.builtin.set_fact: - ansible_distribution: "rockylinux" - when: ansible_distribution == "Rocky" - - - name: "Add MariaDB.org repository" - ansible.builtin.template: - src: "mariadb.repo.j2" - dest: "/etc/yum.repos.d/mariadb.repo" - mode: "0644" - - - name: "Install mariadb server" - ansible.builtin.dnf: - name: - - "MariaDB-server" - - "MariaDB-client" - - "{{ mariadb_python_mysql_version }}" - state: "present" - - - name: "Start and enable mariadb" - ansible.builtin.service: - name: "mariadb" - state: "started" - enabled: true - - - name: "Set mysql root password for all root accounts" - run_once: true - community.mysql.mysql_user: - name: "root" - password: "{{ mysql_root_password }}" - priv: "*.*:ALL,GRANT" - login_unix_socket: "/var/lib/mysql/mysql.sock" - - - name: "MySQL my.cnf" - ansible.builtin.template: - src: "my.cnf.j2" - dest: "/root/.my.cnf" - mode: "0400" - owner: "root" - group: "root" - - - name: "Delete anonymous MySQL server user" - run_once: true - community.mysql.mysql_user: - name: "" - state: "absent" - login_user: "root" - host: "{{ mariadb_host }}" - login_password: "{{ mysql_root_password }}" - - - name: "Delete anonymous MySQL server user for localhost" - run_once: true - community.mysql.mysql_user: - name: "" - state: "absent" - login_user: "root" - host: "{{ mariadb_host }}" - login_password: "{{ mysql_root_password }}" - - - name: "Delete test MySQL server user" - run_once: true - community.mysql.mysql_user: - name: "{{ item }}" - state: "absent" - login_user: "root" - login_password: "{{ mysql_root_password }}" - with_items: - - "test" - - "test_%" - - - name: "Delete anonymous MySQL server user for localhost" - run_once: true - community.mysql.mysql_user: - name: "" - state: "absent" - login_user: "root" - login_password: "{{ mysql_root_password }}" - - - name: "Remove the MySQL test database" - run_once: true - community.mysql.mysql_db: - db: "test" - state: "absent" - login_user: "root" - login_password: "{{ mysql_root_password }}" - - - name: "Create databases" - run_once: true - community.mysql.mysql_db: - name: "{{ item }}" - state: "present" - with_items: - - "{{ databases.names }}" - - - name: "Create database users" - run_once: true - community.mysql.mysql_user: - name: "{{ item[0].name }}" - host: "{{ item[0].hosts | join(',') if item[0].hosts is defined and (item[0].hosts | length>0) else item[1] }}" - password: "{{ item[0].password }}" - priv: "{{ item[0].db_name }}.*:ALL" - state: "present" - append_privs: true - no_log: true - with_nested: - - "{{ databases.users }}" - - "{{ database_clients }}" - - - name: "Create development database users" - run_once: true - community.mysql.mysql_user: - name: "{{ item.name}}" - host: "%" - password: "{{ item.password }}" - priv: "*.*:ALL" - state: "present" - no_log: true - with_items: - - "{{ databases.development_user|default([]) }}" - when: - - develop | bool - - - name: "Allow external connections when in development" - ansible.builtin.lineinfile: - dest: "/etc/my.cnf.d/server.cnf" - insertafter: '\\[mysqld\\]' - state: "present" - line: "bind-address=0.0.0.0" - when: - - develop | bool - - # Add backup user - - name: "Add mariadb backup user" - run_once: true - community.mysql.mysql_user: - name: "{{ mysql_backup_user }}" - password: "{{ mysql_backup_password }}" - login_user: "root" - login_password: "{{ mysql_root_password }}" - priv: "*.*:SELECT,LOCK TABLES,SHOW VIEW" - state: "present" - no_log: true - when: - - backup_node | bool - - - name: "Create the backup directory" - ansible.builtin.file: - path: "/home/backup" - state: "directory" - owner: "root" - group: "root" - mode: "0700" - when: - - backup_node | bool - - - name: "Put mariadb_backup script" - ansible.builtin.template: - src: "mariadb_backup.sh.j2" - dest: "/usr/local/sbin/mariadb_backup.sh" - mode: "0700" - owner: "root" - when: - - backup_node | bool - - - name: "Create cron symlink for backup script" - # todo: use cron task - ansible.builtin.file: - src: "/usr/local/sbin/mariadb_backup.sh" - dest: "/etc/cron.daily/db_backup" - state: "link" - mode: "0700" - owner: "root" - when: - - backup_node | bool + - backup_node | bool diff --git a/roles/mysql/templates/mariadb.sources.j2 b/roles/mysql/templates/mariadb.sources.j2 new file mode 100644 index 000000000..15267c8e1 --- /dev/null +++ b/roles/mysql/templates/mariadb.sources.j2 @@ -0,0 +1,11 @@ +# MariaDB Server +# To use a different major version of the server, or to pin to a specific minor version, change URI below. +X-Repolib-Name: MariaDB Server +Enabled: yes +Types: deb +URIs: https://dlm.mariadb.com/repo/mariadb-server/{{ ansible_distribution_major_version }}.rolling/repo/debian +Suites: {{ ansible_distribution_release }} +Components: main +Architectures: amd64 +Signed-By: /etc/apt/keyrings/mariadb-keyring.gpg +