sql >> データベース >  >> RDS >> MariaDB

Ansibleロールを使用したMySQLデプロイメントの概要

    Ansibleは、反復的で複雑で面倒な操作を自動化および簡素化します。これは、クラウドプロビジョニング、構成管理、アプリケーションデプロイメント、サービス内オーケストレーション、およびその他の多くのITニーズを自動化するIT自動化エンジンです。エージェントは必要ありません。SSHのみを使用して、追加のカスタムセキュリティインフラストラクチャ構成なしで単一のソースから複数のリモートリソースに変更をプッシュし、自動言語形式(YAML)を使用して自動化ジョブを記述します。

    スタンドアロンのMySQLサーバーのインストールは単純で簡単な作業ですが、サポートするデータベースサーバー、バージョン、プラットフォーム、および環境が複数ある場合、これは問題になる可能性があります。したがって、構成管理ツールを使用することは、効率を改善し、反復性を排除し、人的エラーを減らすための方法です。

    このブログ投稿では、AnsibleのMySQLの自動化の基本と、例と説明を含む構成管理について説明します。次の高レベルの図に示すように、単純なスタンドアロンのMySQLデプロイメントから始めます。

    Ansibleのインストール

    このウォークスルーでは、少なくとも2つのホストが必要です。1つはAnsible用(サーバーの代わりにワークステーションを使用できます)で、もう1つはデプロイするターゲットホストです。 MySQLサーバー。

    AnsibleをCentOS7にインストールするには、次のコマンドを実行するだけです。

    (ansible-host)$ yum install -y epel-release
    
    (ansible-host)$ yum install -y ansible

    その他のOSディストリビューションについては、Ansibleインストールガイドをご覧ください。

    パスワードなしのSSHの設定

    SSHでのパスワードの使用はサポートされていますが、ssh-agentでパスワードなしのSSHキーを使用することは、Ansibleを使用するための最良の方法の1つです。 Ansibleはこのチャネルのみでデプロイを実行するため、最初のステップはパスワードなしのSSHを構成することです。まず、AnsibleホストでSSHキーを生成します:

    (ansible-host)$ whoami
    
    root
    
    (ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    少なくとも次のファイルが生成されるはずです。

    (ansible-host)$ ls -al ~/.ssh/
    
    -rw-------. 1 root root 1679 Jan 14 03:40 id_rsa
    
    -rw-r--r--. 1 root root  392 Jan 14 03:40 id_rsa.pub

    パスワードなしのSSHを許可するには、SSH公開鍵(id_rsa.pub)をアクセスするリモートホストにコピーする必要があります。 ssh-copy-idというツールを使用して、このタスクを実行できます。ただし、ターゲットホストのユーザーのパスワードを知っている必要があり、パスワード認証はターゲットホストで許可されています:

    (ansible-host)$ whoami
    
    root
    
    (ansible-host)$ ssh-copy-id [email protected]

    上記のコマンドは、192.168.0.221のルートパスワードの入力を求めます。パスワードを入力するだけで、Ansibleホストの現在のユーザーのSSHキーがターゲットホスト192.168.0.221にコピーされます。 〜/ .ssh / authorized_keysに入れます。これは、その特定のキーがこのサーバーにリモートでアクセスすることを許可することを意味します。テストするには、Ansibleホストからのパスワードなしで次のリモートコマンドを実行できる必要があります:

    (ansible-host)$ ssh [email protected] "hostname -I"
    
    192.168.0.221

    SSHにrootユーザーを使用することが許可されていない場合(たとえば、SSH構成の「PermitRootLoginno」)、代わりにsudoユーザーを使用できます。次の例では、「vagrant」というsudoユーザーにパスワードなしのSSHを設定します。

    (ansible-host)$ whoami
    
    vagrant
    
    (ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    
    (ansible-host)$ ls -al ~/.ssh/
    
    -rw-------. 1 vagrant vagrant 1679 Jan 14 03:45 id_rsa
    
    -rw-r--r--. 1 vagrant vagrant  392 Jan 14 03:45 id_rsa.pub
    
    (ansible-host)$ ssh-copy-id [email protected]

    ターゲットサーバーがSSHによるパスワード認証を許可していない場合は、〜/ .ssh / id_rsa.pubにあるSSH公開鍵の内容をターゲットホストの〜/ .ssh/authorized_keysに手動でコピーするだけです。ファイル。たとえば、Ansibleホストで、公開鍵コンテンツを取得します。

    (ansible-host)$ cat ~/.ssh/id_rsa.pub
    
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

    ターゲットホストに接続し、Ansibleのホスト公開鍵を〜/ .ssh / authorized_keysに貼り付けます:

    (target-host)$ whoami
    
    root
    
    (target-host)$ vi ~/.ssh/authorized_keys
    
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

    Ansibleホストからリモートコマンドを実行して確認することができますが、パスワードの入力を求められることはありません。この時点で、パスワードなしのSSHが構成されています。

    ターゲットホストの定義

    次に、ターゲットホスト、つまりAnsibleを使用して管理するホストを定義する必要があります。私たちのアーキテクチャに基づいて、192.168.0.221であるMySQLサーバーを1つだけデプロイします。次の行を/etc/ ansible/hostsに追加します。

    [db-mysql]
    
    192.168.0.221

    上記は、単に「db-mysql」というグループを定義したことを意味します。これは、Ansibleプレイブックでターゲットホストを参照するときの識別子になります。このグループの下にあるターゲットホストのすべてのIPアドレスまたはホスト名を一覧表示することもできます。この時点で、デプロイするMySQLサーバーは1つしかないため、エントリは1つだけです。たとえば、次のように、1つのグループの下のホストに一致する任意の一致ルールを指定することもできます。

    [db-mysql]
    
    192.168.0.[221:223]

    上記の定義は、このグループの下に次のIPアドレスを持つ3つのホストがあることを意味します。

    • 192.168.0.221
    • 192.168.0.222
    • 192.168.0.223

    Ansibleインベントリガイドに示されているように、ターゲットホストを照合してグループ化する方法とルールはたくさんあります。

    アンシブルロールの選択

    Ansibleに何をデプロイするかを指示するには、Playbookと呼ばれるYML形式のファイルでデプロイ手順を定義する必要があります。ご存知かもしれませんが、完全なMySQLサーバーをインストールするには、すべてのMySQL依存関係、インストール後の構成、ユーザーとスキーマの作成などを満たすために複数の手順が必要です。 Ansibleは私たちを助けることができる多くのMySQLモジュールを提供してきましたが、それでも展開手順のプレイブックを作成する必要があります。

    デプロイ手順を簡素化するために、既存のAnsibleロールを使用できます。 Ansibleの役割は、一般的な構成手順の再利用を可能にする独立したコンポーネントです。プレイブック内でAnsibleロールを使用する必要があります。プレイブックに直接ドロップできるAnsibleロールのリポジトリであるAnsibleGalaxyには、多数のMySQLAnsibleロールがあります。

    「mysql」を検索すると、MySQLのAnsibleロールがたくさん得られます:

    geerlingguyによる「mysql」という名前の最も人気のあるものを使用します。他の役割を使用することもできますが、ほとんどの場合、最もダウンロードされる役割は汎用である傾向があり、通常はほとんどの場合正常に機能します。

    Ansibleホストで、次のコマンドを実行してAnsibleロールをダウンロードします。

    (ansible-host)$ ansible-galaxy install geerlingguy.mysql

    ロールは、現在のユーザーの〜/ .ansible / roles /georlingguy.mysql/にダウンロードされます。

    アンシブルプレイブックの作成

    Ansibleの役割のReadmeを確認することで、提供されているプレイブックの例に従うことができます。まず、deploy-mysql.ymlというプレイブックファイルを作成し、次の行を追加します。

    (ansible-host)$ vim ~/deploy-mysql.yml
    
    - hosts: db-mysql
    
      become: yes
    
      vars_files:
    
        - vars/main.yml
    
      roles:
    
        - { role: geerlingguy.mysql }

    上記の行では、/ etc / ansible/hostsのdb-mysqlエントリの下にあるすべてのホストであるターゲットホストを定義しています。次の行(になる)は、役割に必要なルートユーザーとしてプレイブックを実行するようにAnsibleに指示します(Readmeファイルに記載されています)。次に、プレイブックのパスを基準にして、vars / main.ymlにある変数ファイル(var_files)の場所を定義します。

    変数ディレクトリとファイルを作成し、次の行を指定しましょう:

    (ansible-host)$ mkdir vars
    
    (ansible-host)$ vim vars/main.yml
    
    mysql_root_password: "theR00tP455w0rd"

    詳細については、この役割のReadmeファイルの「役割変数」セクションを確認してください。

    展開を開始する

    これで、MySQLのデプロイを開始する準備が整いました。 ansible-playbookコマンドを使用して、プレイブックの定義を実行します。

    (ansible-host)$ ansible-playbook deploy-mysql.yml
    出力に多数の行が表示されるはずです。展開を要約する最後の行に注目してください:

    PLAY RECAP ***************************************************************************************************************************************
    
    192.168.0.221              : ok=36 changed=8 unreachable=0    failed=0 skipped=16 rescued=0 ignored=0

    すべてが緑色で正常になったら、データベースホストで、MySQLサーバーが既にインストールされ実行されていることを確認できます。

    (mysql-host)$ rpm -qa | grep -i maria
    
    mariadb-server-5.5.64-1.el7.x86_64
    
    mariadb-libs-5.5.64-1.el7.x86_64
    
    mariadb-5.5.64-1.el7.x86_64
    
    
    
    (mysql-host)$ mysqladmin -uroot -p ping
    
    Enter password:
    
    mysqld is alive

    上記からわかるように、CentOS 7の場合、デフォルトのMySQLインストールは標準パッケージリポジトリの一部としてのMariaDB5.5です。この時点で、展開は完了したと見なされますが、次のセクションに示すように、展開をさらにカスタマイズしたいと思います。

    展開のカスタマイズ

    プレイブックの最も単純な定義は、非常に基本的なインストールを提供し、すべてのデフォルト構成オプションを使用します。プレイブックを拡張/変更/追加して次のようにすることで、MySQLのインストールをさらにカスタマイズできます。

    • MySQL構成オプションを変更する
    • データベースユーザーを追加 データベーススキーマを追加 ユーザー権限を構成する
    • MySQLレプリケーションを構成する
    • 他のベンダーからMySQLをインストールする カスタムMySQL構成ファイルをインポートする
    OracleリポジトリからのMySQLのインストール

    デフォルトでは、ロールはOSディストリビューションに付属するデフォルトのMySQLパッケージをインストールします。 CentOS 7の場合、デフォルトでMariaDB5.5がインストールされます。別のベンダーからMySQLをインストールしたい場合、次の例に示すように、.ymlファイルに記載されているタスクを実行する前にAnsibleが実行するタスクであるpre_tasksを使用してプレイブックを拡張できます。

    (ansible-host)$ vim deploy-mysql.yml
    
    - hosts: db-mysql
    
      become: yes
    
      vars_files:
    
        - vars/main.yml
    
      roles:
    
        - { role: geerlingguy.mysql }
    
      pre_tasks:
    
        - name: Install the MySQL repo.
    
          yum:
    
            name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
    
            state: present
    
          when: ansible_os_family == "RedHat"
    
        - name: Override variables for MySQL (RedHat).
    
          set_fact:
    
            mysql_daemon: mysqld
    
            mysql_packages: ['mysql-server']
    
            mysql_log_error: /var/lib/mysql/error.log
    
            mysql_syslog_tag: mysqld
    
            mysql_pid_file: /var/run/mysqld/mysqld.pid
    
            mysql_socket: /var/lib/mysql/mysql.sock
    
          when: ansible_os_family == "RedHat"

    プレイブックを実行する:

    (ansible-host)$ ansible-playbook deploy-mysql.yml

    上記は、代わりにOracleリポジトリからMySQLをインストールします。取得するデフォルトのバージョンはMySQL5.6です。古いバージョンのMySQL/MariaDBがすでに実行されているターゲットホストで上記のプレイブックを実行すると、互換性がないために失敗する可能性があります。

    MySQLデータベースとユーザーの作成

    vars / main.yml内で、mysql_root_passwordの以前の定義の直後に、mysql_databaseおよびmysql_usersモジュールを使用して、AnsibleがMySQLサーバーで構成するMySQLデータベースとユーザーを定義できます。

    (ansible-host)$ vim vars/main.yml
    
    mysql_root_password: "theR00tP455w0rd"
    
    mysql_databases:
    
      - name: myshop
    
        encoding: latin1
    
        collation: latin1_general_ci
    
      - name: sysbench
    
        encoding: latin1
    
        collation: latin1_general_ci
    
    mysql_users:
    
      - name: myshop_user
    
        host: "%"
    
        password: mySh0pPassw0rd
    
        priv: "myshop.*:ALL"
    
      - name: sysbench_user
    
        host: "192.168.0.%"
    
        password: sysBenchPassw0rd
    
        priv: "sysbench.*:ALL"

    定義は、Ansibleに「myshop」と「sysbench」の2つのデータベースを作成し、それぞれのMySQLユーザーに適切な権限、許可されたホストとパスワードを与えるように指示しています。

    Playbookを再実行して、変更をMySQLサーバーに適用します。

    (ansible-host)$ ansible-playbook deploy-mysql.yml

    今回、Ansibleはvars / main.ymlで行ったすべての変更を取得して、MySQLサーバーに適用します。次のコマンドを使用して、MySQLサーバーで確認できます。

    (mysql-host)$ mysql -uroot -p -e 'SHOW DATABASES'
    
    Enter password:
    
    +--------------------+
    
    | Database           |
    
    +--------------------+
    
    | information_schema |
    
    | myshop             |
    
    | mysql              |
    
    | performance_schema |
    
    | sysbench           |
    
    +--------------------+
    
    (mysql-host)$ mysql -uroot -p -e 'SHOW GRANTS FOR [email protected]"192.168.0.%"'
    
    Enter password:
    
    +------------------------------------------------------------------------------------------------------------------------+
    
    | Grants for [email protected]%                                                                                   |
    
    +------------------------------------------------------------------------------------------------------------------------+
    
    | GRANT USAGE ON *.* TO 'sysbench_user'@'192.168.0.%' IDENTIFIED BY PASSWORD '*4AC2E8AD02562E8FAAF5A958DC2AEA4C47451B5C' |
    
    | GRANT ALL PRIVILEGES ON `sysbench`.* TO 'sysbench_user'@'192.168.0.%'                                                  |
    
    +------------------------------------------------------------------------------------------------------------------------+

    低速クエリログの有効化

    この役割は、MySQLの低速クエリログの有効化をサポートします。ログファイルの場所と低速クエリ時間を定義できます。 vars / main.ymlファイル内に必要な変数を追加します:

    mysql_root_password: "theR00tP455w0rd"
    
    mysql_databases:
    
      - name: example_db
    
        encoding: latin1
    
        collation: latin1_general_ci
    
      - name: sysbench
    
        encoding: latin1
    
        collation: latin1_general_ci
    
    mysql_users:
    
      - name: example_user
    
        host: "%"
    
        password: similarly-secure-password
    
        priv: "example_db.*:ALL"
    
      - name: sysbench_user
    
        host: "192.168.0.%"
    
        password: sysBenchPassw0rd
    
        priv: "sysbench.*:ALL"
    
    mysql_slow_query_log_enabled: true
    
    mysql_slow_query_log_file: 'slow_query.log'
    
    mysql_slow_query_time: '5.000000'

    プレイブックを再実行して、変更を適用します:

    (ansible-host)$ ansible-playbook deploy-mysql.yml

    Playbookは、MySQLの低速クエリ関連オプションに必要な変更を加え、MySQLサーバーを自動的に再起動して新しい構成をロードします。次に、新しい構成オプションがMySQLサーバーに正しくロードされているかどうかを確認できます。

    (mysql-host)$ mysql -uroot -p -e 'SELECT @@slow_query_log, @@slow_query_log_file, @@long_query_time'
    
    +------------------+-----------------------+-------------------+
    
    | @@slow_query_log | @@slow_query_log_file | @@long_query_time |
    
    +------------------+-----------------------+-------------------+
    
    |                1 | slow_query.log        | 5.000000 |
    
    +------------------+-----------------------+-------------------+
    カスタムMySQL構成ファイルを含む アンシブルロール変数とMySQL変数は2つの異なるものです。このロールの作成者は、Ansibleロール変数で表すことができるMySQL関連の変数をいくつか作成しました。 Readmeファイルから取得したものを次に示します。

    mysql_port: "3306"
    
    mysql_bind_address: '0.0.0.0'
    
    mysql_datadir: /var/lib/mysql
    
    mysql_socket: *default value depends on OS*
    
    mysql_pid_file: *default value depends on OS*
    
    mysql_log_file_group: mysql *adm on Debian*
    
    mysql_log: ""
    
    mysql_log_error: *default value depends on OS*
    
    mysql_syslog_tag: *default value depends on OS*

    生成された構成がMySQL要件を満たさない場合は、mysql_config_include_files変数を使用してカスタムMySQL構成ファイルをデプロイメントに含めることができます。 Ansibleホストの実際のパスのプレフィックスとして「src」を使用して、コンマで区切られた値の配列を受け入れます。

    まず、Ansibleホストでカスタム構成ファイルを準備する必要があります。ディレクトリと単純なMySQL構成ファイルを作成します:

    (ansible-host)$ mkdir /root/custom-config/
    
    (ansible-host)$ vim /root/custom-config/my-severalnines.cnf
    
    [mysqld]
    
    max_connections=250
    
    log_bin=binlog
    
    expire_logs_days=7

    mysqldump構成専用の別の構成ファイルがあるとしましょう:

    (ansible-host)$ vim /root/custom-config/mysqldump.cnf
    
    [mysqldump]
    
    max_allowed_packet=128M

    これらの構成ファイルをデプロイメントにインポートするには、vars/main.ymlファイルのmysql_config_include_files配列で定義します。

    mysql_root_password: "theR00tP455w0rd"
    
    mysql_databases:
    
      - name: example_db
    
        encoding: latin1
    
        collation: latin1_general_ci
    
      - name: sysbench
    
        encoding: latin1
    
        collation: latin1_general_ci
    
    mysql_users:
    
      - name: example_user
    
        host: "%"
    
        password: similarly-secure-password
    
        priv: "example_db.*:ALL"
    
      - name: sysbench_user
    
        host: "192.168.0.%"
    
        password: sysBenchPassw0rd
    
        priv: "sysbench.*:ALL"
    
    mysql_slow_query_log_enabled: true
    
    mysql_slow_query_log_file: slow_query.log
    
    mysql_slow_query_time: 5
    
    mysql_config_include_files: [
    
      src: '/root/custom-config/my-severalnines.cnf',
    
      src: '/root/custom-config/mysqldump.cnf'
    
    ]

    /root/custom-config/mysqld-severalnines.cnfと/root/custom-config/mysqldump.cnfがAnsibleホスト内に存在することに注意してください。

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

    (ansible-host)$ ansible-playbook deploy-mysql.yml

    プレイブックはこれらの構成ファイルをインポートし、CentOS 7の場合は/etc/my.cnf.d/であるインクルードディレクトリ(OSによって異なります)に配置します。プレイブックは自動再起動します。新しい構成オプションをロードするMySQLサーバー。次に、新しい構成オプションが正しくロードされているかどうかを確認できます。

    (mysql-host)$ mysql -uroot -p -e 'select @@max_connections'
    
    250
    
    (mysql-host)$ mysqldump --help | grep ^max-allowed-packet
    
    max-allowed-packet                134217728
    結論

    Ansibleを使用すると、スクリプトに関する知識がほとんどなくても、データベースの展開と構成管理を自動化できます。一方、ClusterControlは、同様のパスワードなしのSSHアプローチを使用して、データベースクラスターをAからZまで、ユーザーインターフェイスを使用して展開、監視、管理、およびスケーリングします。同じ結果を達成するために追加のスキルは必要ありません。


    1. PostgreSQLの日付から日、月、年を取得する3つの関数

    2. INNERJOINを使用してSQLServerの複数のテーブルを更新する

    3. フィジカル・スタンバイ・データベースのMRPのORA-01111

    4. 配列要素の並べ替え