4.30.2014

Ansible Playbook for MySQL Replication

Ansible: MySQL レプリケーションを実現するためのプレイブック 

 

目的

OSインストール済みの CentOS 6.5 サーバ 2台に対してそれぞれに MySQL をインストールし、
master - slave 構成のレプリケーション環境を構築したい。

普通にやっても面白くないので、Python製のオーケストレーションツール(構成管理ツール) Ansible を使って
インフラの状態をコードとして管理する。

とはいえ実際にやったことと言えば、こちらの素晴らしい playbook のミックスイン写経にすぎない。 

 

コード

説明するよりコードを見たほうが早いと思う。こちらにアップしている。

ファイル、ディレクトリ構成はこのような感じ。

.
├── 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 件のコメント:

コメントを投稿