ansibleguy.infra_mariadb

MariaDB Logo

Ansible-Rolle - MariaDB-Datenbank - Mehrere Instanzen

Ansible-Rolle zum Bereitstellen einer oder mehrerer MariaDB-Instanzen auf einem Linux-Server.

Kauf mir einen Kaffee

Molecule Test Status YamlLint Test Status PyLint Test Status Ansible-Lint Test Status Ansible Galaxy

Molecule-Protokolle: Kurz, Vollständig

Getestet:

  • Debian 11

Installation

# neueste Version
ansible-galaxy role install git+https://github.com/ansibleguy/infra_mariadb

# aus Galaxy
ansible-galaxy install ansibleguy.infra_mariadb

# oder zum benutzerdefinierten Rollenpfad
ansible-galaxy install ansibleguy.infra_mariadb --roles-path ./roles

# Abhängigkeiten installieren
ansible-galaxy install -r requirements.yml

Nutzung

Möchten Sie eine einfache Ansible-GUI? Schauen Sie sich meine Ansible WebUI an.

Konfiguration

Sie müssen Ihre Instanzen definieren, indem Sie das 'mariadb'-Wörterbuch konfigurieren!

mariadb:
  service:
    SyslogIdentifier: 'mariadb_ag_%I'  # %I = Instanz-Schlüssel
    
  instances:
    api:
      root_pwd: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        64373031333937633163366236663237623464336461613334343739323763373330393930666331
        3333663262346337636536383539303834373733326631310a393865653831663238383937626238
        35396531316338373030353530663465343838373635363633613035356338353366373231343264
        3437356663383466630a666161363163346533333139656566386466383733646134616166376638
        35313765356134396130333439663461353336313230366338646165376666313232

      dbs:
        api:
          encoding: 'utf8mb4'

        templates:
        deprecated:
          state: 'absent'
      
      users:
        app:
          priv: 'api.*:ALL'
          pwd: !vault ...
        guy:
          priv: 'api.*:SELECT,SHOW VIEW'
          state: 'absent'
          pwd: !vault ...

      settings:
        # port: 3306
        innodb_log_file_size: 5G
        max_connections: 2000

      backup:
        enabled: true
        dbs: ['api']
        time: '*-*-* 01:00'
        # für Datums- und Zeitformat siehe:
        #   https://wiki.archlinux.org/title/Systemd/Timers
        #   https://silentlad.com/systemd-timers-oncalendar-(cron)-format-explained
        creds:
          create: true

    test:
      ansible_user: 'not_root'
      ansible_pwd: !vault ...
      dbs:
        test:
          
      users:
        dummy:
          priv: 'test.*:ALL'
          pwd: !vault ...
          update_pwd: 'always'  # sonst wird es nur bei der Erstellung gesetzt; das ständige Ändern des Passworts kann Probleme bei aktiven Replikationen verursachen

      settings:
        port: 3307
        log_warnings: 4
        long_query_time: 2
        max_allowed_packet: 2G

    old_instance:
      state: 'absent'

Es könnte sinnvoll sein, 'ansible-vault' zu verwenden, um Ihre Passwörter zu verschlüsseln:

ansible-vault encrypt_string

Ausführung

Führen Sie das Playbook aus:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml --ask-vault-pass

Es gibt auch einige nützliche Tags:

  • base => nur die Grundlagen konfigurieren; Instanzen werden nicht berührt
  • instances
  • config => Konfiguration (Basis und Instanzen)
  • dbs
  • backup => Instanz-Backup-Jobs
  • users

Um Fehler zu debuggen, können Sie die 'debug'-Variable zur Laufzeit setzen:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes

Funktionalität

  • Paketinstallation

    • Ansible-Abhängigkeiten (minimal)
    • MariaDB
  • Konfiguration

    • Mehrere MariaDB-Instanzen

    • Erstellung/Löschung von Datenbanken und Benutzern

    • Startcheck-Skript, das mehrere Instanzen unterstützt

    • Standard-Opt-ins:

      • Sichere Installationsaufgaben ausführen
      • Swappiness herabgesetzt
      • Offene Datei-Limits erhöht (sysctl, Dienst, db)
    • Standard-Opt-outs:

      • DB-Backup-Job
    • Standardkonfiguration:

      • Instanz-Datenverzeichnis: "/var/lib/mysql/instance_${KEY}/"
      • Instanz-Konfiguration: "/etc/mysql/instance.conf.d/server_${KEY}.cnf"
      • Dienstneustart bei Fehlern
      • Protokollierung in syslog
      • Nur an localhost binden
      • SSL AUS
      • Langsame Abfrageprotokolle
      • InnoDB-Datei pro Tabelle
      • DB-DNS-Abfragen deaktiviert
      • Für weitere Informationen siehe das Beispiel unten

Info

  • WARNUNG: Diese Rolle erwartet, dass die standard-mariadb/mysql-Instanz (mysql.service/mariadb.service) auf dem Zielsystem nicht genutzt wird und auch nicht genutzt wird!
    Ihr Socket und Port werden durch das Ausführen dieser Rolle geändert!

  • WARNUNG: Wenn Sie Ihre Datenbankserver in einer aktiven Konfiguration ausführen, sollten Sie diese Rolle niemals gleichzeitig auf beiden Knoten ausführen!
    Sonst könnten die Benutzer-/Datenbank-Erstellung Aufgaben Ihre Synchronisierung stören!

  • Hinweis: Diese Rolle unterstützt derzeit nur Debian-basierte Systeme.

  • Hinweis: Die meisten Funktionen der Rolle können ein- oder ausgeschaltet werden.

    Für alle verfügbaren Optionen siehe die Standardkonfiguration in der Hauptstandarddatei!

  • Hinweis: Wir verwenden die offiziellen Community-Module für die Datenbank und die Benutzer Konfiguration. Replikationsunterstützung könnte später hinzugefügt werden.

  • Hinweis: Das Management von Zertifikaten könnte später in diese Rolle aufgenommen werden.
    Zurzeit müssen Sie die Zertifikate manuell bereitstellen (in /etc/mysql/ssl/{INSTANCE_KEY}/[ca|cert|key].pem platziert)

  • Hinweis: Sie müssen die mysql-Benutzer Berechtigungen GENAU wie von einer SHOW GRANT-Anweisung zurückgegeben definieren!

  • Tipp: Wenn Sie das Datenverzeichnis explizit einhängen, sollten Sie einige Einhängeoptionen festlegen, um die Leistung zu optimieren:

    • noatime,nodiratime
  • Warnung: Verbindungen über TCP/IP zu localhost/127.0.0.1 funktionieren standardmäßig nicht, wenn 'skip-name-resolve' aktiviert ist!

    Es wird dieser Fehler angezeigt: Host '127.0.0.1' ist nicht berechtigt, sich mit diesem MariaDB-Server zu verbinden


Beispiel

Konfiguration

mariadb:
  instances:
    guydb:
      root_pwd: !vault ...

      dbs:
        nice:
        memes:

      users:
        django:
          priv: 'backup.creds.defaults_file is not nonmemes.*:ALL'
          pwd: !vault ...
        backup:
          priv: '*.*:SELECT,RELOAD,PROCESS,LOCK TABLES,BINLOG MONITOR,SHOW VIEW,EVENT,TRIGGER'
          pwd: !vault ...

Ergebnis:

# Konfigurationsverzeichnisse
guy@ansible:~# tree /etc/mysql
> /etc/mysql/
> ├── conf.d
> │   ├── mysql.cnf
> │   └── mysqldump.cnf
> ├── debian.cnf
> ├── debian-start  # Standard-Instanz-Startskript
> ├── debian-start-instance.sh  # Startskript für mehrere Instanzen
> ├── instance.conf.d  # Instanzkonfigurationen
> │   ├── client_guydb_startup-checks.cnf  # Anmeldedaten für den Dienstbenutzer des Startüberprüfungsdienstes
> │   └── server_guydb.cnf  # Instanz-Serverkonfiguration
> ├── mariadb.cnf  # Standard-Instanzkonfiguration
> ├── mariadb.conf.d
> ├── my.cnf -> /etc/alternatives/my.cnf
> └── my.cnf.fallback

# Datenverzeichnisse
guy@ansible:~# tree /var/lib/mysql
> /var/lib/mysql/
> ├── default
> │  └── ...  # Standard-Instanz für mysql
> │
> ├── instance_guydb
> │  └── ...  # konfigurierte Instanz
> │
> └── ...  # Standarddateien => werden nicht automatisch gereinigt

# Instanzkonfigurationsdatei
guy@ansible:~# cat /etc/mysql/instance.conf.d/server_guydb.cnf 
> # Von Ansible verwaltet
> [mysqld]
> datadir = /var/lib/mysql/instance_guydb
> basedir = /usr
> pid-file = /run/mysqld/mysqld_guydb.pid
> socket = /run/mysqld/mysqld_guydb.sock
> lc_messages_dir = /usr/share/mysql
> 
> # Einstellungen
> user = mysql
> group = mysql
> bind_address = 127.0.0.1
> port = 3306
> log_warnings = 2
> character-set-server = utf8mb4
> collation-server = utf8mb4_general_ci
> innodb_file_per_table = 1
> innodb_buffer_pool_size = 512M
> innodb_log_file_size = 1GB
> max_allowed_packet = 512M
> max_connections = 500
> query_cache_size = 64M
> tmp_table_size = 64M
> max_heap_table_size = 64M
> slow-query-log = 1
> slow-query-log-file = slow-queries.log
> long_query_time = 1
> wait_timeout = 60
> symbolic-links = 0
> local-infile = 0
> open_files_limit = 1048576

# Dienstkonfiguration
guy@ansible:~# cat /etc/systemd/system/[email protected]/override.conf 
> # Von Ansible verwaltet
> 
> [Unit]
> ConditionPathExists=/etc/mysql/instance.conf.d/server_%I.cnf
> ConditionPathExists=/etc/mysql/debian-start-instance.sh
> ConditionPathExists=/etc/mysql/instance.conf.d/client_%I_startup-checks.cnf
> Documentation=https://github.com/ansibleguy/infra_mariadb
> 
> [Service]
> Environment='MYSQLD_MULTI_INSTANCE=--defaults-file=/etc/mysql/instance.conf.d/server_%I.cnf --defaults-group-suffix=.%I'
> ExecStartPost=
> ExecStartPost=/etc/mysql/debian-start-instance.sh %I
> 
> LimitNOFILE=1048576
> StandardOutput=journal
> StandardError=journal
> SyslogIdentifier=mariadb_%I
> TimeoutStartSec=900
> TimeoutStopSec=900
> Restart=on-abort
> RestartSec=5s
> OOMScoreAdjust=-600
> BlockIOWeight=1000

# Dienststatus
guy@ansible:~# systemctl status [email protected] 
> ● [email protected] - MariaDB 10.5.12 Datenbankserver (Multi-Instanz guydb)
>      Loaded: laden (/lib/systemd/system/[email protected]; aktiviert; Werksvorgabe: aktiviert)
>     Drop-In: /etc/systemd/system/[email protected]
>              └─override.conf
>      Active: aktiv (läuft)
>        Docs: man:mariadbd(8)
>              https://mariadb.com/kb/en/library/systemd/
>              https://github.com/ansibleguy/infra_mariadb
>     Process: 134872 ExecStartPre=/usr/bin/mysql_install_db $MYSQLD_MULTI_INSTANCE (Code=ausgestiegen, Status=0/ERFOLG)
>     Process: 134910 ExecStartPost=/etc/mysql/debian-start-instance.sh guydb (Code=ausgestiegen, Status=0/ERFOLG)
>      Status: "Nehme jetzt Ihre SQL-Anfragen entgegen..."
>      CGroup: /system.slice/system-mariadb.slice/[email protected]
>              └─134898 /usr/sbin/mariadbd --defaults-file=/etc/mysql/instance.conf.d/server_guydb.cnf --defaults-group-suffix=.guydb

# Datenbanken
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show databases;"
> +--------------------+
> | Datenbank           |
> +--------------------+
> | nice               |
> | memes              |
> | information_schema |
> | mysql              |
> | performance_schema |
> +--------------------+

# MySQL-Benutzer
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "select user, host from mysql.user;"
> +------------------------+-----------+
> | Benutzer               | Host      |
> +------------------------+-----------+
> | backup                 | localhost |
> | django                 | localhost |
> | mariadb.sys            | localhost |
> | mariadb_startup_checks | localhost |  # benötigter Dienstbenutzer für das Startskript (Upgrade-Aufgaben usw.)
> | mysql                  | localhost |
> | root                   | localhost |
> +------------------------+-----------+

# MySQL-Berechtigungen
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show grants for django@localhost;"
> +---------------------------------------------------------------------------+
> | Berechtigungen für django@localhost                                               |
> +---------------------------------------------------------------------------+
> | GRANT USAGE ON *.* TO `django`@`localhost` IDENTIFIED BY PASSWORD 'XXXX'  |
> | GRANT ALL PRIVILEGES ON `memes`.* TO `django`@`localhost`                 |
> +---------------------------------------------------------------------------+

guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show grants for backup@localhost;"
> +------------------------------------------------------------------------------------------------+
> | Berechtigungen für backup@localhost                                                                    |
> +------------------------------------------------------------------------------------------------+
> | GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR, SHOW VIEW, EVENT, TRIGGER ON *.*   |
> | TO `backup`@`localhost` IDENTIFIED BY PASSWORD 'XXXX'                                          |
> +------------------------------------------------------------------------------------------------+
Über das Projekt

Role to deploy one or multiple MariaDB instances on a linux server

Installieren
ansible-galaxy install ansibleguy.infra_mariadb
GitHub Repository
Lizenz
other
Downloads
5k
Besitzer
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg