本日も乙

ただの自己満足な備忘録。

非対話形式でパッケージを自動更新する(debconfを無効化)

[toc]

ちょっとしたTipsです。 最近、Ubuntu Serverを扱うようになりました。今までCentOSを扱ってきたので違いに戸惑うこともありましたが、なかでもパッケージアップデートする際の確認メッセージが出てきたときは最初は驚きました。

apt-get dist-upgradedpkg -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 のいずれも設定されていない場合は、ユーザに確認を求めるため、処理を中断する

参考URL