Puppet で MySQL 5.7.6 以降をセットアップするために mysqld --initialize-insecure を使う
MySQL 5.7 は 昨年10月に GA 出た し、そろそろ導入したいなと。
Puppet でインストール&セットアップしようとしたら、MySQL の root ユーザーのパスワードまわりで手間取ったのでメモ。
(Puppet だけではなく Docker とか、とにかく自動でセットアップしようとしたら関係するはず)
環境は下記のとおり。
忙しい現代人のための 3行まとめ
- MySQL 5.7.4 から root@localhost に自動生成されたパスワードが割り当てられるようになったよ(ただしパスワードは
~/.mysql_secret
に書かれていたので読み取れた) - MySQL 5.7.6 から自動生成されたパスワードが
~/.mysql_secret
に書かれなくなったよ(/var/log/mysqld.log に出力される) - 初期設定時に
mysqld --initialize-insecure
を使うと root@localhost にパスワードが割り当てられないので、自動セットアップしたいときに使うといいよ
以下、詳細。
MySQL 5.7.4: root に自動でパスワードが割り当てられるようになった
MySQL 5.7.4 から root@localhost に自動生成されたパスワードが割り当てられるようになった。
The installation process creates only a single root account, 'root'@'localhost', automatically generates a random password for this account, and marks the password expired.
ざっくり訳: 初期設定の際に mysql_install_db
を使い、root ユーザーにランダムパスワードが自動で割り当てられるようになったよ。
しかし、パスワードは ~/.mysql_secret
に書かれていたので、自動セットアップしたいときはそこからパスワードを読み取れた。
(The random password is found in the .mysql_secret file in the home directory of the effective user running the script.)
MySQL 5.7.6: 自動割り当てられたパスワードが ~/.mysql_secret に書かれなくなった
MySQL 5.7.6 のリリースノートから関連する箇所を引用する。
mysql_install_db functionality now has been integrated into the MySQL server, mysqld. To use this capability to initialize a MySQL installation, if you previously invoked mysql_install_db manually, invoke mysqld with the --initialize or --initialize-insecure option, depending on whether you want the server to generate a random password for the initial 'root'@'localhost' account.
As a result of this change, mysql_install_db is deprecated, as is the special --bootstrap option that mysql_install_db passes to mysqld. These will be removed in a future MySQL release. Also, the $HOME/.mysql_secret file written by mysql_install_db is no longer needed.
解説すると、
初期設定時に mysql_install_db
を使っていたけど、MySQL 5.7.6 からは mysqld
を使う。自動割り当てられたパスワードが ~/.mysql_secret に書かれなくなった。
パスワードは /var/log/mysqld.log
に下記のように出力されるが、これを自動セットアップ時に読み取って、後の処理に利用するのは厳しい。
[Note] A temporary password is generated for root@localhost: xxxxxxxx
しかし、mysqld
使うときに --initialize-insecure
オプションを付けると、root ユーザーにパスワードが自動割り当てされなくなるので、自動セットアップしたいときは、このオプションを使うと良い。
Puppet マニフェスト
Puppet マニフェストで書くと(ざっくり)下記のような感じ。
exec { 'initialize mysql': command => "mysqld --user=mysql --initialize-insecure", creates => "/var/lib/mysql/mysql", }
ちゃんと書くなら puppetlabs-mysql を参考にするのが良さそう。
おまけ)Dockerfile
ほんとうに --initialize-insecure
使って良いんだっけ?何か他にもっと良い方法ある?と思って、docker 公式の mysql コンテナの Dockerfile 見てみたら、やっぱり --initialize-insecure
使ってて安心した。
謝辞
@yoku0825 さんはすごい人。
下記の記事もそうだけど、MySQL 5.7 情報を探していたら、有用な情報はほとんど yoku0825 さんのブログまたは yoku0825 さんのブログ記事を参考にしているものだった。
思えば、何ヶ月か前に、ペパボで勉強会を開いてくださって、すっげえ楽しそうに話してて、「この人、ほんと MySQL のこと好きなんだなー」と思って。
今回 MySQL 5.7 導入しようとしたときにも顔が浮かんだし。つまり背中を押してもらえたということだ。
最高だな。
この場を借りて、お礼を申し上げます。今後ともよろしくお願いします!