Contents
Overview
Ubuntu に限らず deb パッケージと APT コマンドを使用する OS 全般に関することですが、コマンドオプションを意識せずに使用すると TUI が表示されて入力待ち状態になることがあります。これは、debconf や needrestart の効果によるものです。
APT としては良かれと思って設計されているものと思いますが、Yum や DNF に慣れているとかなり扱いづらい設計です。都度の確認は不要なのでとりあえずデフォルトで進めてもらいたいです。
本稿では TUI を表示しない APT コマンドの使用方法を記載しています。他の手順もこのコマンドを使用しています。
前提条件
- こちらを参考にネットワーク設定が完了していること。
Ansible 実行ログとの比較と考察
DEBIAN_FRONTEND=noninteractive
は当初から知っていたのですが、Ansible で APT コマンドを使用する際は この問題が発生しない為、Ansible ではどのように APT コマンドを発行しているか気になりました。
APT コマンドのログは /var/log/apt/history.log
に記載されており、Ansible から発行した APT コマンドには -o Dpkg::Options::=--force-confdef
, -o Dpkg::Options::=--force-confold
等の見慣れないオプションが付与されていました。
myadmin@ubuntu:~$ cat /var/log/apt/history.log
Start-Date: 2022-05-29 12:29:49
Commandline: /usr/bin/apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold upgrade --with-new-pkgs
Requested-By: myadmin (1000)
Upgrade: libjson-c5:amd64 (0.15-2build4, 0.15-3~ubuntu1.22.04.1)
End-Date: 2022-05-29 12:29:49
Start-Date: 2022-05-23 15:06:57
Commandline: /usr/bin/apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install postfix
Requested-By: myadmin (1000)
Install: postfix:amd64 (3.6.4-1ubuntu1)
End-Date: 2022-05-23 15:07:08
コマンドオプションをキーワードにして検索してみると、Debian 管理者ハンドブックに記載されている内容そのままです。この内容でも「奇跡の組み合わせ」とされていることから、これらの挙動は apt, dpkg のかなり深い根本に関わるものと想像できます。逆に言うと一概に正しい方法は無く、エンジニアが各々の方法で対応しているのが現状の様です。
http://l.github.io/debian-handbook/html/ja-JP/sect.automatic-upgrades.html
APT の TUI を抑止する情報はネット上に散乱している状態ですが、Debian 管理者ハンドブックに書かれている情報と、実際に Ansible で使われているコマンドオプションの内容から、Ansible が発行しているコマンドオプションを参考にするのが今のところ確実そうです。
Dpkg コマンドオプションの説明は以下の通りです。
コマンドオプション | 説明 |
---|---|
-o Dpkg::Options::=–force-confdef | –force-confdef は、パッケージがデフォルトの設定ファイルを持っている場合に、新しい設定ファイルが提供されても、既存の設定ファイルを上書きしないように指示します。 |
-o Dpkg::Options::=–force-confold | –force-confold は、パッケージがアップグレードされる際に新しいバージョンに含まれる設定ファイルが既存の設定ファイルと競合する場合、既存の設定ファイルを保持するように指示します。 |
–with-new-pkgs は、APT の upgrade コマンドのオプションとして使用されます。このオプションを使用すると、APT は新しいパッケージが利用可能な場合にのみパッケージをアップグレードするようになります。通常、upgrade コマンドはシステム内のすべてのパッケージを最新のバージョンにアップグレードしますが、–with-new-pkgs オプションを指定すると、新しいパッケージがない場合はアップグレードをスキップします。このため、より効率的なアップグレードが可能になると思います。
これに行き着くまで needrestart をアンインストールしてみたりといろいろと試しましたが、どうもしっくりこなく後述の内容に落ち着きました。
TUI を抑止する APT コマンド
システムアップデート
システム全体をアップデートする際の例です。これにより確実に TUI を抑止できます。欠点はコマンドが長くなるので手入力は現実的で無くコピペになるでしょう。
myadmin@ubuntu:~$ sudo apt update
myadmin@ubuntu:~$ sudo DEBIAN_FRONTEND=noninteractive apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold upgrade --with-new-pkgs
新規パッケージのインストール
一例として Postfix をインストールしています。説明はシステムアップデートと同じです。
myadmin@ubuntu:~$ sudo DEBIAN_FRONTEND=noninteractive apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install postfix
長すぎるコマンドオプションを短くする
前述の通り、コマンドオプションが長すぎるため、手動入力は現実的ではありません。デフォルトの設定値としてこれらのコマンドオプションを定義できないか検討してみました。
DEBIAN_FRONTEND=noninteractive
まず、DEBIAN_FRONTEND=noninteractive
についてです。これは単なる環境変数であり、対処は以下の通り簡単です。これにより、次回のログイン時からは apt
コマンドに DEBIAN_FRONTEND=noninteractive
を含める必要はありません。
myadmin@ubuntu:~$ sudo tee /etc/profile.d/debian_frontend.sh <<"EOF"
export DEBIAN_FRONTEND=noninteractive
EOF
これにより、僅かですがコマンドを短くすることができます。
myadmin@ubuntu:~$ sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install postfix
-o Dpkg::Options::=–force-confdef, -o Dpkg::Options::=–force-confold
-o Dpkg::Options::=--force-confdef
, -o Dpkg::Options::=--force-confold
については、/etc/apt
内の設定を色々と試しましたが、デフォルトの動作とすることはできませんでした。検証自体も結果を確認するのが面倒ということがあり、一旦諦めることとします。機会があれば、また検討したいと思います。