[toc]
ちょっとしたTipsです。 最近、Ubuntu Serverを扱うようになりました。今までCentOSを扱ってきたので違いに戸惑うこともありましたが、なかでもパッケージアップデートする際の確認メッセージが出てきたときは最初は驚きました。
apt-get dist-upgrade
や dpkg -i xxxx.deb
などでパッケージをインストールやアップデートする際に debconfという仕組みによって、ユーザに質問されます。質問内容はパッケージ毎に異なりますが、アップデートの場合は、既存の設定ファイルをどうするか(残すか置き換えるか)を聞かれるようです。
質問に答えていくことで設定が完了するのでとても便利に思えます。一台のサーバで実行するには特に問題はありませんが、複数台のサーバで一気にインストールやアップデートする場合に問題になります。ChefやAnsibleなどによる設定や、脆弱性のあるパッケージをアップデートする場面では、コマンドラインで複数台に対して実行するので、インタラクティブな質問をされると処理が止まってしまいます。
RHEL系であれば、yum -y
で自動的に実行してくれるので、Debian系も同じように-y
オプションを付ければ良いと思っていましたが、付けても変わらず質問画面が出てきてしまいました。
色々調べた結果、以下のようにすれば良いことがわかりました。
apt-get
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
# カーネルも含めたアップデート
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
dpkg
xxxxxx.deb
は任意のdebパッケージを指定してください。
$ sudo DEBIAN_FRONTEND=noninteractive dpkg --force-confdef --force-confold -i xxxxxx.deb
解説
DEBIAN_FRONTEND=noninteractive
でdebconfを無効化します。
--force-confdef
, --force-confold
というのは、アップデートの際に、現在の設定ファイルをどう扱うかを指定しています。
--force-confold
: 設定ファイルが変更されている場合、現在の設定ファイルを変更されない。.dpkg-dist
というサフィックスが付いた設定ファイルが新規作成される。--force-confdef
を同時に指定した場合は、デフォルトの動作が優先される(変更されていない設定ファイルは上書きされる)--force-confnew
: 新しいバージョンの設定ファイルに置き換わる。現在の設定ファイルは.dpkg-old
というサフィックスがついたファイルに保存される。--force-confdef
が同時に指定した場合は、デフォルトの動作が優先される--force-confdef
: 設定ファイルが変更されている場合、デフォルトの動作を実行する。--force-confnew
、--force-confold
のいずれも設定されていない場合は、ユーザに確認を求めるため、処理を中断する