Edited at

AnsibleでMySQLの新しいバージョンをインストールしてDB・ユーザ作成する時の注意点

More than 3 years have passed since last update.

前回ansibleでmysqlのインストールで手こずったのでメモです。

上記のURLで紹介しているMySQLは http://ftp.jaist.ac.jp/ からインストールしていました。

苦しかったymlの書き方


site.yml

---

- hosts: local.example.com
sudo: yes
vars:
mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
tasks:
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
- name: start mysql
service: name=mysql state=started enabled=yes
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
- name: setup mysql root
command: mysqladmin -u root password {{ mysql_root_password.stdout }}
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: setup mysql database
mysql_db: name=test state=present
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present

何をやっているのかというと、

実行するホストを宣言します。

- hosts: local.example.com

sudoで全部実行することを宣言します。

  sudo: yes

varsで変数に値を入れています。

  vars:

mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm

ansibleで実行するタスクを書いていきます。

  tasks:

yumでmysqlを引っ張ってきます。

    - name: install mysql

yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items

mysqlをrestart。

    - name: start mysql

service: name=mysql state=started enabled=yes

初期パスワードが.mysql_secret内に記述されているため、パスワードだけawkで抜き出して変数に設定します。

    - name: get mysql password

shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password

rootのパスワードを設定しないと、ansibleから実行すると

failed: [...] msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials.

とエラーが出てしまうので、先ほどの初期設定パスワードで上書きします。

    - name: setup mysql root

command: mysqladmin -u root password {{ mysql_root_password.stdout }}

.my.cnfが無いと上記と同じエラーが起きるので、あらかじめ用意してある.my.cnfに先ほど設定したパスワードを設定してVagrantサーバー上にコピーします。

    - name: copy .my.cnf

template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600

testデーターベース作成。

    - name: setup mysql database

mysql_db: name=test state=present

testユーザー作成。

    - name: setup mysql user

mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present

と、いうのが前回の記事。

実はそんなことしなくても、MySQL本家 http://dev.mysql.com/ からインストールすれば上記よりも四苦八苦はしなくて良かったです。

正解のymlの書き方


site.yml

---

- hosts: local.example.com
sudo: yes
vars:
mysql_url: http://dev.mysql.com/get/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
tasks:
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
- name: start mysql
service: name=mysql state=restarted enabled=yes
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: setup mysql database
mysql_db: name=test state=present
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present

わざわざrootのパスワード設定しなくても動きました。

こっちのほうが重くないので本家以外からインストールしている人は見直してみるといいかもしれません。

MySQL5.5だと、更に.mysql_secret自体が無くなり、my.cnfのコピーも不要になりもっと楽に設定できます(rootはノンパス)。