Ansibleは、反復的で複雑で面倒な操作を自動化および簡素化します。これは、クラウドプロビジョニング、構成管理、アプリケーションデプロイメント、サービス内オーケストレーション、およびその他の多くのITニーズを自動化するIT自動化エンジンです。エージェントは必要ありません。SSHのみを使用して、追加のカスタムセキュリティインフラストラクチャ構成なしで単一のソースから複数のリモートリソースに変更をプッシュし、自動言語形式(YAML)を使用して自動化ジョブを記述します。
スタンドアロンのMySQLサーバーのインストールは単純で簡単な作業ですが、サポートするデータベースサーバー、バージョン、プラットフォーム、および環境が複数ある場合、これは問題になる可能性があります。したがって、構成管理ツールを使用することは、効率を改善し、反復性を排除し、人的エラーを減らすための方法です。
このブログ投稿では、AnsibleのMySQLの自動化の基本と、例と説明を含む構成管理について説明します。次の高レベルの図に示すように、単純なスタンドアロンのMySQLデプロイメントから始めます。
このウォークスルーでは、少なくとも2つのホストが必要です。1つはAnsible用(サーバーの代わりにワークステーションを使用できます)で、もう1つはデプロイするターゲットホストです。 MySQLサーバー。
AnsibleをCentOS7にインストールするには、次のコマンドを実行するだけです。
(ansible-host)$ yum install -y epel-release
(ansible-host)$ yum install -y ansible
その他のOSディストリビューションについては、Ansibleインストールガイドをご覧ください。
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レプリケーションを構成する
デフォルトでは、ロールは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がすでに実行されているターゲットホストで上記のプレイブックを実行すると、互換性がないために失敗する可能性があります。
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_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まで、ユーザーインターフェイスを使用して展開、監視、管理、およびスケーリングします。同じ結果を達成するために追加のスキルは必要ありません。