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

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

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
No 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
ユーザーは見つかりませんでした