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


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

* [かつおくんへ Vagrant × Ansible でローカル開発環境を作成](http://qiita.com/bboobbaa/items/c5466369d744a29dc6e9)

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

<h2>苦しかったymlの書き方</h2>

```bash: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
```
何をやっているのかというと、

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

```bash:
- hosts: local.example.com

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

```bash:
  sudo: yes

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

```bash:
  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で実行するタスクを書いていきます。

```bash:
  tasks:
```
yumでmysqlを引っ張ってきます。

```bash:
    - name: install mysql
      yum: name={{ mysql_url }}/{{ item.rpm }} state=present
      with_items: mysql_items
```
mysqlをrestart。

```bash:
    - name: start mysql
      service: name=mysql state=started enabled=yes
```
初期パスワードが.mysql_secret内に記述されているため、パスワードだけawkで抜き出して変数に設定します。

```bash:
    - 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.`
とエラーが出てしまうので、先ほどの初期設定パスワードで上書きします。

```bash:
    - name: setup mysql root
      command: mysqladmin -u root password {{ mysql_root_password.stdout }}
```
.my.cnfが無いと上記と同じエラーが起きるので、あらかじめ用意してある.my.cnfに先ほど設定したパスワードを設定してVagrantサーバー上にコピーします。

```bash:
    - name: copy .my.cnf
      template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
```
testデーターベース作成。

```bash:
    - name: setup mysql database
      mysql_db: name=test state=present
```
testユーザー作成。

```bash:
    - name: setup mysql user
      mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present
```
と、いうのが前回の記事。
実はそんなことしなくても、MySQL本家 http://dev.mysql.com/ からインストールすれば上記よりも四苦八苦はしなくて良かったです。

<h2>正解のymlの書き方</h2>

```bash: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はノンパス）。