今回は 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 作成方法については こちら を参照してください。
構成は以下の通りです。
.
├── 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 (実行サーバ自身) です。
[dbservers]
localhost
dbservers.yml
メイン Playbook です。
対象の db Role との関連付けを行っています。
---
- name: install and configure the db
hosts: dbservers
remote_user: root
roles:
- db
group_vars/dbservers
タスクで使用する変数を定義しています。
root パスワードは適宜変更してください。
# dbservers Variables
mysqld_5_6:
# root パスワード
root_password: xxxxxxxx
# 接続用設定ファイルパス
defaults_file: /root/.my.cnf
Ansible から MySQL 関連のモジュールを利用する際のログインユーザは、以下の中から利用されます。
tasks/main.yml
main.yml ではタスクの読み込みを行っています。
タスクの詳細は各ファイルで記述しています。
今回はインストールのみですが、データのインポートや個別の設定が必要な場合に追記するとよいと思います。
---
- include: install_mysqld_5_6.yml
install_mysqld_5_6.yml
MySQL 5.6 のインストール手順となります。
---
# 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 接続用のためにも必要となりますが、パスワードを記載しているため取り扱いには考慮が必要です。
[client]
user=root
password={{ mysqld_5_6.root_password }}
以上、タスクの記述となります。
Playbook の実行
作成した Playbook を実行しましょう。
$ 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・ユーザの作成は別の機会に投稿したいと思います。