TL;DR
- chef-mysql-apt を書きました。
- 公式 deb で mysql-server の 5.7 をパスワード無しでインストールすると、mysql.user.plugin が auth_socket になるので、
ALTER USER
で明示的に plugin を変更しないとパスワードを変更できないので気をつけた方がよい。 - chef の
remote_file
での checksum の指定は、ダウンロードしたファイルの checksum を確認するものではないので気をつけた方がよい。 (違うとドキュメントに書いてあるけれど)
cookbook を書きました
MySQL を公式 APT リポジトリからインストールする Chef の cookbook、chef-mysql-apt を書いたのですが、非対話型の環境でのインストールという面でいくつかはまったポイントがあったので、それらの情報をまとめます。
cookbook を利用するだけであれば、node を以下のように設定すれば MySQL 5.7 のサーバーをインストールできます。
非対話型環境での mysql-apt-config のインストール
mysql-apt-config
の deb は、インストール時に debconf で MySQL のバージョンを指定して、その結果にしたがって /etc/apt/sources.list.d/mysql.list
を生成するという動作をするのですが、非対話型の環境でインストールした場合は未選択の状態となってしまい、どのリポジトリも追加されません。
調べたところ、どうもこういった場合には、debconf-set-selections
を使うのが定石であるようなので、cookbook では以下のように対応しました。
debconf
からの再設定は本来であれば以下のコマンドでできるような気がするのですが、どうもうまくいかない(応答が無くなってしまう)ので dpkg -r
して dpkg -i
しています。
sudo dpkg-reconfigure -fnoninteractive mysql-apt-config
非対話型環境で mysql-server をインストールした場合の root ユーザーの設定
非対話型環境で公式 APT リポジトリの mysql-server (mysql-community-server) をインストールするとパスワード無しの状態でインストールされるのですが、ここに若干の落とし穴がありました。
mysql -u root
でログインできない!sudo mysql_secure_installation
は成功するのに、入力したパスワードでmysql -u root -p
で接続しようとしてもできない!
ということで悩んでしまったのですが、mysql-community-server
の postinst を確認したところ、
UPDATE user SET plugin='auth_socket' WHERE user='root';
をしているということが分かりました。
- plugin が auth_socket なので、root ユーザーの権限で socket 経由でないと接続できない
- 単に
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
するだけではパスワードを更新できなくてALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass';
のよう明示的に authentication plugins を更新する必要があるmysql_secure_installation
で更新されたように見えてできないのはバグな気がします
ということだったようです。cookbook の方でも authentication plugins を更新するようにして、root のパスワードを初期化できるようになりました。
chef の remote_file での checksum
余談ですが、chef の remove_file
には checksum を指定できるのですが、ダウンロードしたファイルのハッシュ値が一致することは確認されません。ドキュメントには「The SHA-256 checksum of the file. Use to prevent a file from being re-downloaded.」とあるので、確かにそれを目的とはしていなさそうではありますが。(でも、変な値を入れておいても再ダウンロードされるわけでもないようで、バグなのか詳細追えていないですが) ユースケース的には remote_file
こそ、checksum を確認したいような気がするのですが。
とりあえずこの cookbook では、 remote_file
の後に file
を使って確認する感じにしています。
コメント