MySQL APT repositoryからMySQL 5.7.xをインストールするスクリプト

Ubuntu 14.04 (Trusty)にMySQL APT RepositoryからMySQL 5.7 (Development Release)を インストールするスクリプトを書きました。

Vagrantfileと共にhnakamur/noninteractive_install_mysql_from_apt_repository_to_ubuntu_trustyに置いてあります。

使い方

MySQL :: Download MySQL APT Repositoryをブラウザで見てmysql-apt-config_x.x.x-1ubuntu14.04_all.debのファイルのバージョンを確認し、スクリプト内の mysql_apt_deb_file変数の値をを適宜修正してください。

スクリプト内のmysql_root_password変数の値を設定したいMySQLのrootユーザのパスワードに変更してください。

あとはスクリプトを実行すればOKです。

スクリプトの実装メモ

noninteractiveなmysql-apt-configのインストール

単に sudo dpkg -i mysql-apt-config_0.3.7-1ubuntu14.04_all.deb のように実行すると、途中でCUIのダイアログが開いてMySQLサーバのバージョンなどを聞かれてしまいます。自動インストール用のスクリプトではインタラクティブに聞かれてほしくないので export DEBIAN_FRONTEND=noninteractive を指定する必要があります。 Ubuntu Manpage: debconf - Debian package configuration systemに説明があります。

またその後 sudo dpkg ... だと環境変数を引き継がないので sudo -E dpkg ... のように -E オプションを指定しています。bash - install mysql on ubuntu without password prompt - Stack Overflowで知りました。

実行するのが1回だけなら sudo DEBIAN_FRONTEND=noninteractive dpkg ... のほうがシンプルで良いと思います。が、今回は後でmysql-community-serverをインストールするときにも必要なので上記の方式にしました。

export DEBIAN_FRONTEND=noninteractive だけで良い場合もありますが、ダイアログで選ぶ値を予め設定しておく必要がある場合もあります。 dpkg - How to configure the MySQL APT repo on Ubuntu, on a non-interactive shell? - Unix & Linux Stack Exchangeで mysql-apt-config のインストールには echo mysql-apt-config mysql-apt-config/enable-repo select mysql-5.7-dmr | sudo debconf-set-selections としておけば良いらしいという情報を得ました。

ですが、調査のために mysql-apt-config を手動インストールしてその前後で

sudo debconf-get-selections | grep mysql

して設定される項目を見てみると違う名前になっていました。スクリプトでは手動インストールで設定される項目に合わせて設定するようにしました。

noninteractiveなmysql-community-serverのインストール

こちらも同様に export DEBIAN_FRONTEND=noninteractive のあと sudo -E apt-get -y install ... でインストールしています。設定値は bash - install mysql on ubuntu without password prompt - Stack Overflowを参考にしつつ、まず手動インストールして sudo debconf-get-selections | grep mysql で設定値を確認し、それに合わせて設定するようにしました。

noninteractiveなmysql_secure_installationの実行

コードで実行! mysql_secure_installation プロビジョニング | サイブリッジラボブログにも書かれていますが、MySQL 5.5の頃はインタラクティブな入力を要求するシェルスクリプトだったので、中身を読んで等価な処理をすることができました。私も以前等価なスクリプトを書いていました。

しかし、5.7ではmysql_secure_installationはバイナリになってしまいました。 man mysql_secure_installation で確認したところ、--password もしくは -p オプションはあるが無視して必ずパスワードプロンプトを出すと書いてありました。自動インストール用スクリプトでは困るのですが、

./.mysql_root_password.cnf

[client]
password=${mysql_root_password}

といった内容のファイルを作って --defaults-extra-file オプションで指定すれば回避できました。

プロンプトが出て入力する部分は標準入力にリダイレクトで流し込めば OKでした。ただし、MySQLのrootユーザのパスワードを変えるパターンは試してないです。

上記の入力に対する出力結果をコメントとして残しています。

  • MySQLのrootユーザのパスワードは変えない
  • パスワードの強度チェッカーはインストールしない
  • anonymousユーザは削除する
  • リモートからのrootユーザのログインは許可しない
  • testデータベースは削除
  • 権限をリロード

という設定となっています。

標準入力に流し込むのではなく --use-default オプションを使うという手もあります。 --use-defaultの場合の出力結果もコメントとして残しています。 この場合の設定内容は以下の通りです。

  • MySQLのrootユーザのパスワードは変えない
  • パスワードの強度チェッカーをSTRONGの強度に設定する
  • anonymousユーザは削除する
  • リモートからのrootユーザのログインは許可しない
  • testデータベースは削除
  • 権限をリロード

パスワードチェッカーのSTRONGの強度の説明によると、8文字以上で、文字種は数値、英字大文字、英字小文字、記号を全て含める必要があり、辞書に登録されている単語は弾くようです。実際には試してないので違うかもしれません。

参考: debconf-set-selections で設定した項目の削除方法

debconf-set-selections で設定した項目は debconf-get-selections で確認できますが、削除はどうするのかとググってみたら debian - How do I delete values from the debconf database? - Server Fault に説明を見つけました。

echo PURGE | debconf-communicate パッケージ名

のようにすると「パッケージ名」に対する全ての設定を削除できました (スクリプトでは使っていませんが、試行錯誤中に試しました)。 Configuration management にPURGEと他のコマンドについて説明があるとのことです。

おわりに

というわけで何とか自動化出来ました。個人的にはインストール用のコマンドはコマンドラインオプションか環境変数を設定したらノンインタラクティブで実行できるように作っておいて欲しいなあと思います。インタラクティブにしたい場合もインタラクティブモードで起動するようなコマンドラインオプションをつけて、ダイアログで選択が終わったらそれに対応するコマンドラインオプションを指定して起動したかのように処理をするような作りにすればいいのではないでしょうか。