MariaDBをAnsibleつかってインストールしたやーつ

某社に飼い殺しにされているMySQLに代わり、MariaDBをansibleによってインストールしたのでそのメモです。

この記事が使用するバージョンは執筆時の最新である「10.0.21-MariaDB」です。

はじめに

Ansibleが必要なので動作検証したい方はpipか何かでインストールしておいてください。バージョンはとりあえず最新でいいです。

Vagrant(CentOS7)上に作りたいので以下のようにします。

Vagrantfile

VAGRANTFILE_API_VERSION = "2" 
 
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-7.0"
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.provision :ansible do |ansible|
    ansible.playbook = "provision.yml"
    ansible.inventory_path = "hosts"
    ansible.limit = 'all'
  end
end

hosts

ホスト名は「maria」にします。もう名前からして可愛いですね。

[maria]
192.168.33.11

provision.yml

起点となる定義をprovision.ymlに書きます。(Vagrantfileと揃えれば名前は何でもOK)
今回のゴールはインストールして簡単な操作ができるところまでとします。なのでDBとユーザを作ります。

後で再利用しやすいようにroleで作ります。

- hosts: maria
  sudo: yes
  roles:
    - roles/mariadb

  vars:
    linux_dist: centos
    linux_dist_ver: 7
  tasks:
    - name: create maria user
      mysql_user: name=maria password=mariapass priv=*.*:ALL state=present host={{item}}
      with_items:
        - '%'
        - 'localhost'

    - name: create mariadb database
      mysql_db: name=mariadayo state=present

アカウントは「maria/mariapass」、データベースは「mariadayo」にしました。

roles/mariadb/tasks/

main.yaml

- name: include redhat
  when: ansible_os_family == "RedHat"
  include: redhat.yml

- name: copy my.cnf
  template: src=my.cnf.j2 dest dest=/etc/my.cnf
  changed_when: False
  notify: mysqld restart

redhat.yaml

yumを使ったインストールは本家サイトにあるのを参考にします。
単純にyumのリポジトリを登録してインストールするだけですが、登録するrepoファイルによってインストールできるバージョンが異なります。
MariaDBはマイナーバージョンの古いRPMをあまり残していないようなので、バージョンを完全に固定したい人は手元にRPMを落としてきたほうがいいかもしれません。(全くないわけじゃないけど古いやつだと消えてたりする)
今回の設定ではデフォルトで10.0を指定しました。これにより10.0.Xの最新が使われることになります。md5sumが等しいことを確認してみてください。

- name: set mariadb.repo
  template: src=mariadb.repo.j2 dest=/etc/yum.repos.d/mariadb.repo

- name: install mariadb
  yum: name={{item}} state=installed
  with_items:
    - MariaDB-server
    - MariaDB-client
 
# MySQL関連モジュールを使うためにインストール
- name: install MySQL-python
  yum: name=MySQL-python state=installed

- name: run mysql-server
  service: name=mysql state=running enabled=yes

roles/mariadb/handlers/

これはMySQLのパクリ

main.yaml

- name: mysqld restart
  service: name=mysqld state=restarted

roles/mariadb/templates/

mariadb.repo.j2

yumのリポジトリ設定ファイルです。「baseurl」にインストールしたいバージョンとディストリの指定があります。

# MariaDB 10.0 CentOS repository list - created 2015-07-20 15:05 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/{{mariadb_ver}}/{{linux_dist}}{{linux_dist_ver}}-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

my.cnf.j2

MariaDBでは設定ファイルを分けて記述することができるようになったようです。
「/etc/my.cnf.d」というディレクトリにある設定をincludeするように設定します。

[client-server]
!includedir /etc/my.cnf.d

以下の設定ファイルが「/etc/my.cnf.d/」に配置され、読み込まれます。

server.cnf.j2

MariaDBサーバの文字コード・チューニング情報・しきい値などの設定を記述します。

設定項目についてはリファレンスを参照してください。

デフォルトのserver.cnfはセクションとコメントが記述されているだけで設定項目は書かれていません。設定項目はなんとなく選びました。

[server]
# this is only for the mysqld standalone daemon
 
#hostname = {{mariadb_server_hostname}}
port = {{mariadb_server_port}}
 
# connection
max-allowed-packet = {{mariadb_server_max_allowed_packet}}
max-connections = {{mariadb_server_max_connections}}
 
# other server section
{{mariadb_server_section}}
 
 
[mysqld]
read-only = {{mariadb_server_read_only}}
autocommit = {{mariadb_server_auto_commit}}
default-storage-engine = {{mariadb_server_default_storage_engine}}
 
# buffer
read-buffer-size = {{mariadb_server_read_buffer_size}}
sort-buffer-size = {{mariadb_server_sort_buffer_size}}
bulk-insert-buffer-size = {{mariadb_server_bulk_insert_buffer_size}}
join-buffer-size = {{mariadb_server_join_buffer_size}}
 
# cache
query-cache-type = {{mariadb_server_query_cache_type}}
query-cache-size = {{mariadb_server_query_cache_size}}
query-cache-limit = {{mariadb_server_query_cache_limit}}
query-cache-min-res-unit = {{mariadb_server_query_cache_min_res_unit}}
 
# charset
character-set-server = {{mariadb_server_character_set_server}}
collation-server = {{mariadb_server_collation_server}}
 
# file
datadir = {{mariadb_server_datadir}}
#pid-file = {{mariadb_server_pid}}
general-log = {{mariadb_server_general_log}}
general-log-file = {{mariadb_server_general_log_file}}
 
# time
default-time-zone = {{mariadb_server_default_time_zone}}
connect-timeout = {{mariadb_server_connect_timeout}}
wait-timeout = {{mariadb_server_wait_timeout}}
 
# other mysqld section
{{mariadb_mysqld_section}}
 
# this is only for embedded server
[embedded]
{{mariadb_embedded_section}}
 
 
[mariadb]
{{mariadb_mariadb_section}}
 
 
[mariadb-{{mariadb_ver}}]
{{mariadb_version_section}}

server.cnfには「server」「mysqld」「embedded」「mariadb」「mariadb-10.0」などのセクションがありますが、それぞれの設定項目をどこに記述しなければならない等のルールはなさそうです。実際にセクションを変更しても設定は適用されているようでした。

現在の設定値を確認するときは「show variables」ですね。likeも使えます。

MariaDB [mariadayo]> SHOW VARIABLES LIKE '%buffer%';
+-------------------------------------+----------------+
| Variable_name                       | VALUE          |
+-------------------------------------+----------------+
| aria_pagecache_buffer_size          | 134217728      |
| aria_sort_buffer_size               | 268434432      |
| bulk_insert_buffer_size             | 838608         |
| innodb_buffer_pool_dump_at_shutdown | OFF            |
| innodb_buffer_pool_dump_now         | OFF            |
| innodb_buffer_pool_filename         | ib_buffer_pool |
| innodb_buffer_pool_instances        | 8              |
| innodb_buffer_pool_load_abort       | OFF            |
| innodb_buffer_pool_load_at_startup  | OFF            |
| innodb_buffer_pool_load_now         | OFF            |
| innodb_buffer_pool_populate         | OFF            |
| innodb_buffer_pool_size             | 134217728      |
| innodb_change_buffer_max_size       | 25             |
| innodb_change_buffering             | ALL            |
| innodb_log_buffer_size              | 8388608        |
| innodb_sort_buffer_size             | 1048576        |
| join_buffer_size                    | 131072         |
| join_buffer_space_limit             | 2097152        |
| key_buffer_size                     | 134217728      |
| mrr_buffer_size                     | 262144         |
| myisam_sort_buffer_size             | 134216704      |
| net_buffer_length                   | 16384          |
| preload_buffer_size                 | 32768          |
| read_buffer_size                    | 131072         |
| read_rnd_buffer_size                | 262144         |
| sort_buffer_size                    | 2097152        |
| sql_buffer_result                   | OFF            |
+-------------------------------------+----------------+
27 ROWS IN SET (0.00 sec)

client.cnf.j2

[client]
default-character-set = {{mariadb_client_default_character_set}}
 
{{mariadb_client_section}}
 
[client-mariadb]
{{mariadb_client_mariadb_section}}

mysql-client.cnf.j2

[mysql]
{{mariadb_mysql_client_mysql_section}}
 
[mysql_upgrade]
{{mariadb_mysql_client_mysql_upgrade_section}}
 
[mysqladmin]
{{mariadb_mysql_client_mysqladmin_section}}
 
[mysqlbinlog]
{{mariadb_mysql_client_mysqlbinlog_section}}
 
[mysqlcheck]
{{mariadb_mysql_client_mysqlcheck_section}}
 
[mysqldump]
{{mariadb_mysql_client_mysqldump_section}}
 
[mysqlimport]
{{mariadb_mysql_client_mysqlimport_section}}
 
[mysqlshow]
{{mariadb_mysql_client_mysqlshow_section}}
 
[mysqlslap]
{{mariadb_mysql_client_mysqlslap_section}}

tokudb.cnf.j2

tokudbとは大容量対応のストレージエンジンらしいです。
ただ、この設定ファイルが何に使われるのか全くわかってません
とりあえず必要なさそうなのでそのまま(じゃあ省略しろよとか言わない

[mariadb]
{{mariadb_tokudb_mariadb_section}}

roles/mariadb/defaults/

上記を補完するデフォルト値たち

main.yaml

# common
mariadb_ver: 10.0
 
 
# server
mariadb_server_hostname: "{{hostname | default( 'localhost')}}"
mariadb_server_port: 3306
mariadb_server_read_only: 0
mariadb_server_auto_commit: 1
mariadb_server_default_storage_engine: InnoDB
 
## buffer
mariadb_server_read_buffer_size: 131072
mariadb_server_sort_buffer_size: 2M
mariadb_server_bulk_insert_buffer_size: 838608
mariadb_server_join_buffer_size: 131072
 
## cache
mariadb_server_query_cache_type: 1
mariadb_server_query_cache_size: 0
mariadb_server_query_cache_limit: 1048576
mariadb_server_query_cache_min_res_unit: 4096
 
## charset
mariadb_server_character_set_server: utf8
mariadb_server_collation_server: utf8_general_ci
 
## connection
mariadb_server_max_allowed_packet: 1048576
mariadb_server_max_connections: 151
 
## file
mariadb_server_datadir: /var/lib/mysql
mariadb_server_pid: /var/run/mysqlaa.pid
mariadb_server_general_log: 0
mariadb_server_general_log_file: '{{mariadb_server_hostname}}.log'
 
## time
mariadb_server_default_time_zone: SYSTEM
mariadb_server_connect_timeout: 10
mariadb_server_wait_timeout: 28800
 
## other server
mariadb_server_section: ''
mariadb_mysqld_section: ''
mariadb_embedded_section: ''
mariadb_mariadb_section: ''
mariadb_version_section: ''
 
 
# client
mariadb_client_default_character_set: utf8
 
## other client
mariadb_client_section: ''
 
# client-mariadb
mariadb_client_mariadb_section: ''
 
 
# mysql-client
mariadb_mysql_client_mysql_section: ''
mariadb_mysql_client_mysql_upgrade_section: ''
mariadb_mysql_client_mysqladmin_section: ''
mariadb_mysql_client_mysqlbinlog_section: ''
mariadb_mysql_client_mysqlcheck_section: ''
mariadb_mysql_client_mysqldump_section: ''
mariadb_mysql_client_mysqlimport_section: ''
mariadb_mysql_client_mysqlshow_section: ''
mariadb_mysql_client_mysqlslap_section: ''
 
 
# tokudb
mariadb_tokudb_mariadb_section: ''

準備ができたのでVagrantを起動します。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'chef/centos-7.0'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'chef/centos-7.0' is up to date...
==> default: Setting the name of the VM: maria_default_1438783054971_72492
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /home/user/Tests/maria
==> default: Running provisioner: ansible...

PLAY [maria] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.11]

TASK: [roles/mariadb | set mariadb.repo] ************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | install mariadb] *************************************** 
changed: [192.168.33.11] => (item=MariaDB-server,MariaDB-client)

TASK: [roles/mariadb | install MySQL-python] ********************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | set my.cnf] ******************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | set server.cnf] **************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | set client.cnf] **************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | set mysql-client.cnf] ********************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | set tokudb.cnf] **************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | run mysql-server] ************************************** 
changed: [192.168.33.11]

TASK: [roles/mariadb | copy my.cnf] ******************************************* 
ok: [192.168.33.11]

TASK: [create maria user] ***************************************************** 
changed: [192.168.33.11] => (item=%)
changed: [192.168.33.11] => (item=localhost)

TASK: [create mariadb database] *********************************************** 
changed: [192.168.33.11]

PLAY RECAP ******************************************************************** 
192.168.33.11              : ok=13   changed=11   unreachable=0    failed=0   

こんな感じになるので仮想環境・MariaDBにログインします。

$ vagrant ssh
[vagrant@localhost ~]$ mysql -umaria -pmariapass mariadayo
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.0.20-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

できてそう。

じゃあ適当に試します。
全くいい例が思い浮かばないので適当な商品で..

MariaDB [mariadayo]> CREATE TABLE goods 
    -> (
    ->     id INTEGER PRIMARY KEY,
    ->     name VARCHAR(20),
    ->     category VARCHAR(10)
    -> );
Query OK, 0 rows affected (0.01 sec)

MariaDB [mariadayo]> INSERT INTO goods (id, name, category) VALUES
    ->     (1, 'ペン', '文房具'),
    ->     (2, 'ジュース', '飲み物'),
    ->     (3, 'パン', '食べ物'),
    ->     (4, 'アイス', '食べ物'),
    ->     (5, 'お茶', '飲み物')
    -> ;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

MariaDB [mariadayo]> SELECT count(*), id, name, category
    -> FROM goods
    -> GROUP BY category;
+----------+----+--------------+-----------+
| count(*) | id | name         | category  |
+----------+----+--------------+-----------+
|        1 |  1 | ペン         | 文房具    |
|        2 |  3 | パン         | 食べ物    |
|        2 |  2 | ジュース     | 飲み物    |
+----------+----+--------------+-----------+
3 rows in set (0.00 sec)

はい、OKそうですね。
MySQLっぽい動きです。

ハマったところ

PIDファイル

サーバの設定項目(server.cnf)に「hostname」「pid-file」を設定するとPIDファイルが見当たらないというエラーが発生してしまいます。
まだ未解決ですが、とりあえず指定しなければ問題なさそうなのでコメントアウトして放置中。

文字コード

デフォルトの文字コードがlatin1になっているようです。
DBを作った後に設定変更して再起動しても自然と変更されないので最初に変えておきましょう。

あまり嬉しくなかったのでroleではUTF8がデフォルトとなるようにしました。こちらを参考にさせていただきました。ありがとうございました。

ちなみに文字コード変えるのは以下で。

MariaDB [mariadayo]> alter database mariadayo character set utf8;