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

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

前回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はノンパス)。