おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

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 導入しようとしたときにも顔が浮かんだし。つまり背中を押してもらえたということだ。

最高だな。

この場を借りて、お礼を申し上げます。今後ともよろしくお願いします!