AnsibleでRPMのMySQL5.7のインストール・初期設定を自動化してみた

MySQL v5.7ではrootの初期設定まわりがいろいろ変わっており、 v5.6をベースにした記事を見てもそのままでは使えなかったりします。

Ansibleを使ってMySQL 5.7をインストール・初期設定するところまでできたのでやり方を紹介します。

注意

これはあくまで簡易版で、Vagrantのような開発環境構築を想定しています。 本番サーバに適用する場合はもっとセキュリティを重視する必要があるでしょう。

自分はMySQLに関しては初級者なので、ツッコミ歓迎です。もっといいやり方があれば教えてください。

手順

  • RPMを使ってMySQL5.7をインストールする
  • ログファイルを解析してrootのパスワードを得る
  • rootのパスワードを /root/.tmp.my.cnf に記述する
  • /root/.tmp.my.cnf を使ってrootログインし、rootのパスワードを変更する
  • と同時に新パスワードを/root/.my.cnf に記述する
  • /root/.my.cnf を使って rootログインし、GRANT文やCREATE DATABASE文を実行する

RPMを使ってMySQL5.7をインストールする

下記記事に従ってMySQLをインストールし起動します。

CentOS7にMySQL5.7をYumでインストールする方法

ログファイルを解析してrootのパスワードを得る

ログファイル (/var/log/mysqld.log) にrootの初期パスワードが書かれているのでこれをパースして取得します。

log_file=/var/log/mysqld.log
tmp_pass=$(sudo grep 'password is generated' $log_file | awk -F'root@localhost: ' '{print $2}')

rootのパスワードを /root/.tmp.my.cnf に記述する

取得したパスワードを一時設定ファイルに保存しておきます。

tmp_file=/root/.tmp.my.cnf
umask 0077
cat > $tmp_file <<EOF
[client]
user=root
password=$tmp_pass
connect-expired-password
EOF

/root/.tmp.my.cnf を使ってrootログインし、rootのパスワードを変更する

上記の設定ファイルを使ってログインし、パスワードを変更します。

new_pass='MyNewPass4@'
mysql --defaults-file=/root/.tmp.my.cnf -e "ALTER USER 'root'@'localhost' IDENTIFIED BY  '$new_pass' "

変更したらそれを保存しておきます。

umask 0077
cat > /root/.my.cnf <<EOF
[client]
user=root
password=$new_pass
EOF

これで、自分用のパスワードでrootログインすることができるようになります。

新規ユーザを作成する

GRANT文でユーザを作成します。

 mysql -e "GRANT ALL ON mydatabase.* TO pikachu IDENTIFIED BY 'FooBar12345@' "

後はこんな感じでCREATE DATABASEしたりテーブルを作ったりすればOKです。

Ansibleのplaybook

上記の手順をplaybookに書くとこんな感じになります。

- name: add repo
  command: rpm -ih http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm creates=/etc/yum.repos.d/mysql-community.repo

- name: install mysql-community-server
  yum: name=mysql-community-server state=installed

- name: install MySQL-python for ansible mysql_user module
  yum: name=MySQL-python state=installed

- name: start server
  service: name=mysqld state=started enabled=yes

- name: save-mysql-tmp-password.sh
  script: save-mysql-tmp-password.sh creates=/root/.tmp.my.cnf

- name: set new password
  script: change-root-password.sh creates=/root/.my.cnf

- name: create new user
  shell: mysql -e "GRANT ALL ON *.* TO pikachu IDENTIFIED BY 'FooBar12345@' "

参考

[Ansible] dev.mysql.comのrpmでMySQL 5.6をインストール

カテゴリ: