Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

今回は 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 (実行サーバ自身) です。

hosts
[dbservers]
localhost

dbservers.yml

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

dbservers.yml
---

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

  roles:
    - db

group_vars/dbservers

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

group_vars/dbservers
# dbservers Variables

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

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

tasks/main.yml

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

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

install_mysqld_5_6.yml

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

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 を実行しましょう。

$ 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・ユーザの作成は別の機会に投稿したいと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away