ansibleでCentOS7にmysql5.7系のインストールしてみた

社内ツールを作ったり壊したりしている永井です。
名前は覚えなくていいので「スプラトゥーン2は楽しい」ということだけ覚えておいて下さい。

お仕事でmysql5.7の環境を構築する機会がありました。
今更ですがせっかくなのでAnsibleでいい感じに入れてみるかーと思いAnsibleで構築してみたところ詰まったり詰まったりしたので完成品と共に紹介したいと思います。

環境

  • デプロイ元
    • ansible
      • 2.3.1.0
  • デプロイ先
    • CentOS
      • 7.2

要件

  • インストール
  • validate_passwordのアンインストール
  • 任意のrootパスワードに変更

完成品

できたものがこちらです。

---
- name: install mysql repository
  yum:
    state: present
    name: http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
    validate_certs: no

- name: install necessary libraries
  yum:
    state: present
    name: "{{ item }}"
  with_items:
    - yum-utils
    - MySQL-python
    - mysql-community-server

- name: running mysqld
  service:
    name: mysqld
    state: started
    enabled: yes

- name: chack root login
  shell: mysql -uroot -pany_password
  register: root_login_result
  ignore_errors: True

- name: get temporary password
  shell: cat /var/log/mysqld.log | grep "temporary password" | awk '{print $11}'
  register: mysql_default_password
  when: root_login_result.rc != 0

- name: change root user password for updating expiration date
  shell: |
    mysql -u root -p'{{ mysql_default_password.stdout }}' --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Do_You_Love_MySQL5.7?';"
  when: root_login_result.rc != 0

- name: uninstall validate_password
  shell: |
    mysql -u root -p"Do_You_Love_MySQL5.7?" --connect-expired-password -e "uninstall plugin validate_password;"
  when: root_login_result.rc != 0

- name: change root user password
  shell: |
    mysql -u root -p'Do_You_Love_MySQL5.7?' --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'any_password';" # 任意のパスワード
  when: root_login_result.rc != 0

とりあえずインストールしたい方は、これをピーッとコピーしてペッとrolesの中やplaybookのtasks内にでも貼って貰えれば動くと思います。多分。

パスワードは今回は直打ちにしてありますが、セキュリティのため環境変数にすると良いと思います。

ざっくり解説

インストール自体はyumでサクッとできます。リポジトリを追加してからyum installでmysqlをインストールします。

しかしパスワード周りが少し厄介です。インストール直後のmysql5.7は仮のrootパスワードが設定されています。この仮パスワードは有効期限が切れていて、真っ先にこれを変更しないと大体何もできません

仮rootパスワードは/var/log/mysqld.logに記録されているので読み取ってログインしパスワードを変えます。

パスワードの縛りも激しく、8文字以上で英大文字小文字数字記号の4種類を含む必要があります。これはmysql5.7.8以降に標準で有効になっている"validate_password"というプラグインの働きによるものです。

少し厳しすぎるのもあり、いの一番にそいつを消してやりたいところですが期限の切れたrootパスワードを変えない限り消すこともできません。パスワードを変えないといけない、縛りがキツい、縛りを取りたい、パスワードを変えないといけない、縛りがk(ry。

任意のパスワードに変える流れは以下のとおりです。

  1. /var/log/mysqld.logから初期パスワードを取得しログイン
  2. 8文字以上で英大文字小文字数字記号の4種類を含む文字列を使ったパスワードに変更
  3. validate_passwordをアンインストール
  4. 任意のパスワードに変更する。

まとめ

mysql5.7はセキュリティのレベルが高い反面初見殺しが増えております。
ただ最初の方はrootパスワードさえ突破してやれば問題なく使うことができると思います。

新機能も増え、3倍速くなったと言われるmysql5.7を活用しましょう!(もうmysql8とか出てるけど)ちなみ自分の運用しているサービスで走っているあるクエリは90倍速くなりました。

ではこのへんで、ありがとうございました。