ansibleguy.infra_mariadb

MariaDB Logo

Ansibleロール - MariaDBデータベース - マルチインスタンス

Ansibleロールを使用してLinuxサーバー上に1つまたは複数のMariaDBインスタンスを展開します。

コーヒーを買ってください

Moleculeテストステータス YamlLintテストステータス PyLintテストステータス Ansible-Lintテストステータス Ansible Galaxy

Moleculeログ: 短縮版フル版

テスト済み:

  • Debian 11

インストール

# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_mariadb

# Galaxyから
ansible-galaxy install ansibleguy.infra_mariadb

# またはカスタムロールパスへ
ansible-galaxy install ansibleguy.infra_mariadb --roles-path ./roles

# 依存関係のインストール
ansible-galaxy install -r requirements.yml

使用法

簡単なAnsibleのGUIが必要ですか?私のAnsible WebUIをチェックしてください。

設定

'mariadb'辞書を設定することでインスタンスを定義する必要があります!

mariadb:
  service:
    SyslogIdentifier: 'mariadb_ag_%I'  # %I = インスタンスキー
    
  instances:
    api:
      root_pwd: !vault |
        # パスワードの暗号化と書き方は省略

      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:
        innodb_log_file_size: 5G
        max_connections: 2000

      backup:
        enabled: true
        dbs: ['api']
        time: '*-*-* 01:00'
        creds:
          create: true

    test:
      ansible_user: 'not_root'
      ansible_pwd: !vault ...
      dbs:
        test:
          
      users:
        dummy:
          priv: 'test.*:ALL'
          pwd: !vault ...
          update_pwd: 'always'

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

    old_instance:
      state: 'absent'

パスワードを暗号化するために 'ansible-vault'を使用することをお勧めします:

ansible-vault encrypt_string

実行

プレイブックを実行します:

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

いくつかの便利なタグも利用可能です:

  • base => 基本設定のみ;インスタンスは変更しません
  • instances
  • config => 設定(基本とインスタンス)
  • dbs
  • backup => インスタンスバックアップジョブ
  • users

エラーをデバッグするには、実行時に 'debug'変数を設定できます:

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

機能

  • パッケージインストール

    • Ansible依存関係 (最小限)
    • MariaDB
  • 設定

    • 複数のMariaDBインスタンス

    • データベースとユーザーの作成/削除

    • 複数インスタンスをサポートするスタートチェックスクリプト

    • デフォルトのオプトイン:

      • セキュアインストールタスクの実行
      • スワップネスの低下
      • オープンファイル制限の増加 (sysctl, service, db)
    • デフォルトのオプトアウト:

      • DBバックアップジョブ
    • デフォルトの設定:

      • インスタンスデータディレクトリ: "/var/lib/mysql/instance_${KEY}/"
      • インスタンス設定: "/etc/mysql/instance.conf.d/server_${KEY}.cnf"
      • 障害時のサービス再起動
      • syslogへのログ
      • localhostのみにバインド
      • SSLオフ
      • スロークエリログ
      • テーブルごとのInnoDBファイル
      • DB DNSルックアップ無効

情報

  • 警告: デフォルトのmariadb/mysqlインスタンス (mysql.service/mariadb.service)がターゲットシステムで使用されることはありません。このロールを実行するとソケットとポートが変更されます!

  • 警告: アクティブ-アクティブ構成でDBサーバーを実行している場合、両方のノードで同時にロールを実行しないでください!ユーザーやデータベース作成タスクが同期を壊す可能性があります!

  • 注意: このロールは現在、Debianベースのシステムのみをサポートしています。

  • 注意: 多くの機能はオプトインまたはオプトアウトできます。

    利用可能なオプションは、メインデフォルトファイルにあるデフォルト設定を参照してください!

  • 注意: データベースとユーザーの設定には公式のコミュニティモジュールを使用しています。リプリケーションサポートは後で追加される可能性があります。

  • 注意: 証明書管理は後でこのロールに追加される可能性があります。現時点では、証明書は手動で提供する必要があります (/etc/mysql/ssl/{INSTANCE_KEY}/[ca|cert|key].pem)

  • 注意: mysql-user権限は、SHOW GRANTステートメントの結果と正確に一致させる必要があります!

  • ヒント: ディレクトリを明示的にマウントする場合、パフォーマンスを最適化するためにいくつかのマウントオプションを設定してください。

    • noatime,nodiratime
  • 警告: 'skip-name-resolve'が有効になっている場合、localhost/127.0.0.1へのTCP/IP接続はデフォルトでは機能しません!

    このエラーが発生します: Host '127.0.0.1' is not allowed to connect to this MariaDB server


設定

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 ...

結果:

# 設定ディレクトリ
guy@ansible:~# tree /etc/mysql
> /etc/mysql/
> ├── conf.d
> │   ├── mysql.cnf
> │   └── mysqldump.cnf
> ├── debian.cnf
> ├── debian-start  # デフォルトインスタンスのスタートスクリプト
> ├── debian-start-instance.sh  # マルチインスタンススタートスクリプト
> ├── instance.conf.d  # インスタンス設定
> │   ├── client_guydb_startup-checks.cnf  # スタートアップチェック用のログインデータ
> │   └── server_guydb.cnf  # インスタンスサーバー設定
> ├── mariadb.cnf  # デフォルトインスタンス設定
> ├── mariadb.conf.d
> ├── my.cnf -> /etc/alternatives/my.cnf
> └── my.cnf.fallback

# データディレクトリ
guy@ansible:~# tree /var/lib/mysql
> /var/lib/mysql/
> ├── default
> │  └── ...  # mysqlデフォルトインスタンス
> │
> ├── instance_guydb
> │  └── ...  # 設定されたインスタンス
> │
> └── ...  # デフォルトファイル => 自動的には掃除されない

# インスタンス設定ファイル
guy@ansible:~# cat /etc/mysql/instance.conf.d/server_guydb.cnf 
> # Ansible管理
> [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
> 
> # 設定
> 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

# サービス設定
guy@ansible:~# cat /etc/systemd/system/[email protected]/override.conf 
> # Ansible管理
> 
> [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

# サービスの状態
guy@ansible:~# systemctl status [email protected] 
> ● [email protected] - MariaDB 10.5.12データベースサーバー (マルチインスタンス guydb)
>      Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
>     Drop-In: /etc/systemd/system/[email protected]
>              └─override.conf
>      Active: active (running)
>      Process: 134872 ExecStartPre=/usr/bin/mysql_install_db $MYSQLD_MULTI_INSTANCE (code=exited, status=0/SUCCESS)
>      Status: "SQLリクエストを受け付けています..."
> 
# データベース
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show databases;"
> +--------------------+
> | データベース         |
> +--------------------+
> | nice               |
> | memes              |
> | information_schema |
> | mysql              |
> | performance_schema |
> +--------------------+

# mysqlユーザー
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "select user, host from mysql.user;"
> +------------------------+-----------+
> | ユーザー               | ホスト      |
> +------------------------+-----------+
> | backup                 | localhost |
> | django                 | localhost |
> | mariadb.sys            | localhost |
> | mariadb_startup_checks | localhost |  # スタートアップスクリプト用のサービスユーザー
> | mysql                  | localhost |
> | root                   | localhost |
> +------------------------+-----------+

# mysql権限
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show grants for django@localhost;"
> +---------------------------------------------------------------------------+
> | 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;"
> +------------------------------------------------------------------------------------------------+
> | backup@localhostの権限                                                                       |
> +------------------------------------------------------------------------------------------------+
> | GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR, SHOW VIEW, EVENT, TRIGGER ON *.*   |
> | TO `backup`@`localhost` IDENTIFIED BY PASSWORD 'XXXX'                                          |
> +------------------------------------------------------------------------------------------------+
プロジェクトについて

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

インストール
ansible-galaxy install ansibleguy.infra_mariadb
ライセンス
other
ダウンロード
5k
所有者
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg