Ansible: MySQL レプリケーションを実現するためのプレイブック
目的
OSインストール済みの CentOS 6.5 サーバ 2台に対してそれぞれに MySQL をインストールし、
master - slave 構成のレプリケーション環境を構築したい。
普通にやっても面白くないので、Python製のオーケストレーションツール(構成管理ツール) Ansible を使って
インフラの状態をコードとして管理する。
とはいえ実際にやったことと言えば、こちらの素晴らしい playbook のミックスイン写経にすぎない。
- Ansible Galaxy | Find, reuse, and share the best Ansible content
- ansible-playbooks/mysql5.6 at master · akishin/ansible-playbooks
コード
説明するよりコードを見たほうが早いと思う。こちらにアップしている。
ファイル、ディレクトリ構成はこのような感じ。
. ├── README.md 簡単な説明 ├── Vagrantfile CentOS 6.5 x2台をVirtualBoxで ├── host_vars │ ├── mysql-master レプリケーションに関わるホスト単位の定義 │ └── mysql-slave ├── hosts インベントリ用 ├── roles │ └── mysql │ ├── handlers │ │ └── main.yml conf書き換え時にサービス再起動 │ ├── tasks │ │ └── main.yml メインディッシュ │ ├── templates │ │ ├── .my.cnf.j2 rootユーザ用の認証情報を書いておく │ │ └── my.cnf.j2 設定ファイルのテンプレート │ └── vars │ └── main.yml バージョン設定やユーザのアカウントなど └── site.yml
ポイント
Vagrantfile
opscode の CentOS 6.5 イメージをダウンロードして使用。
SELinux が有効だったので、libselinux-python を事前にインストールする必要があった。
IPアドレスは適当に振った。
site.yml
とりあえず vagrant ユーザで、sudo してタスクを実行する設定。
roles/mysql/tasks/main.yml
一連の処理を 5個のフェーズに分けている。
- 1. Install packages
- jaist.ac.jp から新しめのパッケージを一式ダウンロード
- ローカルファイルを yum モジュールでインストールする際、
/usr/local/src/{{ item }} のような指定ができなかったので、やむを得ずパスを echo するだけのタスクを一個作っている (need improvement) - MySQL関連の操作をするため、MySQL-python のインストールが必要
- 今回、スローログを /var/log/mysql-slow.log として書くため、パーミッションの関係で事前にファイルを touch している
- 2. Change credentials for root
- /root/.mysql_secret ファイルが存在する場合にはパスワードが初期設定のままと判断し、roles/mysql/vars/main.yml の方で指定した root パスワードに設定し直す
- 新しいパスワードは、/root/.my.cnf に記録しておく
- 3. Setup users
- ゲストアクセスを停止し、アプリユーザ、レプリケーション用ユーザを作成
- 4. Create database
- test データベースを削除し、vars で指定したDB (今回は awesome) を作成
- 5. Replication settings
- mysql_replication モジュールを活用
- ハマったのが、changemaster する時に以下のようなエラーが出て、コマンドが success にならないこと。
_mysql_exceptions.Warning: Sending passwords in plain text without SSL/TLS is extremely insecure.
MySQL 5.6 の仕様変更の影響で、start slave の時にパスワードを指定するのが新しいお作法のようだが、どうにもうまくいかず。
結局、不本意ながら (ignore_errors: True) を設定した。(need improvement)
roles/mysql/templates/my.cnf.j2
jinja2 のテンプレートファイル。if や for を活用している。
slave 側には read_only の設定を入れた。
遊び方
Vagrantfile を作ったので手元でも試せる。README 参照。
0 件のコメント:
コメントを投稿