Ansible でインストール (MySQL 5.6)

今回は MySQL 5.6 を Ansible からインストールしてみたいと思います。
Web アプリケーションでは必須となる DBMS として利用する機会は多いと思います。
今回は最新版の 5.7 ではなく 5.6 をインストールします。

## 環境

* CentOS 6.7
* ansible 2.0

※開発環境利用の為、iptables / SELinux については事前に無効化しております。
※yum で "Developer tools" グループを インストールし、必要なコマンドは適宜導入しています。

## Playbook の記述

Playbook は Role 構造で記述します。
Role 作成方法については [こちら](http://qiita.com/KisaragiZin/items/02465058e3b930cc094e) を参照してください。

構成は以下の通りです。

```bash:
.
├── group_vars
│   └── dbservers                      # 各タスクで使用する変数定義
├── hosts
├── roles
│   └── db
│       ├── handlers
│       │   └── main.yml               # httpd handler の定義
│       ├── tasks
│       │   ├── main.yml               # 各インストール yaml の呼び出し
│       │   └── install_mysqld_5_6.yml # httpd インストール
│       └── templates
│           └── .my.cnf.j2             # MySQL 接続用設定ファイルテンプレート
└── webservers.yml
```

**hosts**

インストール対象ホストの設定です。
今回は localhost (実行サーバ自身) です。

```ini:hosts
[dbservers]
localhost
```

**dbservers.yml**

メイン Playbook です。
対象の db Role との関連付けを行っています。

```yaml:dbservers.yml
---

- name: install and configure the db
  hosts: dbservers
  remote_user: root

  roles:
    - db
```

**group_vars/dbservers**

タスクで使用する変数を定義しています。
root パスワードは適宜変更してください。


```yaml:group_vars/dbservers
# dbservers Variables

mysqld_5_6:
  # root パスワード
  root_password: xxxxxxxx
  # 接続用設定ファイルパス
  defaults_file: /root/.my.cnf
```

Ansible から MySQL 関連のモジュールを利用する際のログインユーザは、以下の中から利用されます。


**tasks/main.yml**

main.yml ではタスクの読み込みを行っています。
タスクの詳細は各ファイルで記述しています。
今回はインストールのみですが、データのインポートや個別の設定が必要な場合に追記するとよいと思います。

```yaml:tasks/main.yml
---
- include: install_mysqld_5_6.yml
```

**install_mysqld_5_6.yml**

MySQL 5.6 のインストール手順となります。

```yaml:install_mysqld_5_6.yml
---
# install mysqld_5.6
- name:  レポジトリの登録
  yum:
    name: http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
    state: present

- name: mysqld のインストール
  yum:
    name: "{{ item }}"
    enablerepo: mysql56-community
    disablerepo: mysql57-community
    state: present
  with_items:
    - mysql-community-server
    - mysql-community-client
    - mysql-community-common
    - mysql-community-libs
    - mysql-community-libs-compat

- name: mysqld 起動・自動起動設定
  service:
    name=mysqld
    state=started
    enabled=yes

- name: Ansible 用 mysql モジュールで必要なパッケージのインストール
  yum:
    name: MySQL-python
    state: present

- name: 初期設定確認(mysqladmin ping で確認)
  shell: "mysqladmin --defaults-file={{ mysqld_5_6.defaults_file}} ping | grep alive"
  ignore_errors: true
  register: init_flag

- name: anonymous ユーザの削除
  mysql_user:
    name: ""
    host: "{{ item }}"
    state: absent
  with_items:
    - localhost.localdomain
    - localhost
  when: init_flag.rc == 1

- name: root ユーザのパスワード変更
  mysql_user:
    name: "root"
    host: "{{ item }}"
    password: "{{ mysqld_5_6.root_password }}"
  with_items:
    - 127.0.0.1
    - ::1
    - localhost.localdomain
    - localhost
  when: init_flag.rc == 1

- name: root ユーザ接続設定ファイル作成
  template:
    src: .my.cnf.j2
    dest: "{{ mysqld_5_6.defaults_file }}"
    owner: root
    group: root
    mode: 0600
  when: init_flag.rc == 1
```

初期設定として以下を順に実行しています。
・anonymous(無名)ユーザの削除
・root ユーザのパスワード変更
・root ユーザの接続設定ファイルの作成(.my.cnf)
※初回実行時は root ユーザがパスワード設定無しの為、root@localhost のパスワード設定を最後にすることで、MySQL モジュールが利用可能となります。

ansible の mysql モジュールを利用する場合はログイン用のアカウントが必要となります。
ログインアカウントの設定は、
・Playbook 内で login_password/login_user を設定する。
・Ansible 実行ユーザの接続設定ファイル(~/.my.cnf)を読み込む。
・最終手段としてにroot ユーザとパスワード無しでログインする。
となります。

冪等性を考えた Playbook は難しいですね。
もう少し考慮が必要と思ってます。

**templates/.my.cnf.j2**

MySQL 接続用の設定ファイルのテンプレートです。
Ansible 接続用のためにも必要となりますが、パスワードを記載しているため取り扱いには考慮が必要です。

```:.my.cnf.j2
[client]
user=root
password={{ mysqld_5_6.root_password }}
```

以上、タスクの記述となります。

## Playbook の実行

作成した Playbook を実行しましょう。

```bash:
$ ansible-playbook -i hosts dbservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=10   changed=7    unreachable=0    failed=0
# 確認の為、再実行
$ ansible-playbook -i hosts dbservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=7    changed=1    unreachable=0    failed=0
# db アクセス確認
$ mysql
・・・
mysql>
```

MySQL にアクセスできたでしょうか。
Ansible を利用すると、DB の作成、ユーザの作成、MySQL のシステム変数変更も自動化できるので初期導入には重宝すると思います。
DB・ユーザの作成は別の機会に投稿したいと思います。