unattended-upgradeでサードパーティリポジトリも自動アップデートする

Linux

なんとこのBlog、1年以上更新していなかったことに気がついたのでたまには更新しようという塩梅。

DebianやUbuntuに収録されているunattended-upgrades。自動的にdebパッケージを更新してくれたり、kernelのような再起動が必要なパッケージに更新があった場合はOSのリブートもしてくれるという、なかなか便利なヤツである。毎日6時と18時に実行されるらしいので、その時間帯にサービスが一瞬でも止まっちゃ困るヤツだと使えないけれど。まあたいていの企業の日本国内向けのホームページなWebサイトならそんなに困ることはないと思う。

ちょっと困るのが、ディストリビューションに含まれるパッケージはいいのだけれど、PPAで追加したりしたリポジトリのパッケージは自動更新されなかったりする。結局手でやるのはメンドい。

なので、サードパーティリポジトリも自動更新されるように設定を行う。なお、下記の説明はUbuntu-16.04LTS (Xenial) や18.04LTS (Bionic) に含まれるunattended-upgrades-1.1のハナシである。Debian (Raspbian)-9(Stretch) に含まれているunattended-upgrades-0.93とかだとまたちょっと違う。

まず、ファイル「/etc/apt/apt.conf.d/50unattended-upgrades」を見てよう。以下のような記述が見つかるハズだ。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
〜(中略)〜
}

この「Unattended-Upgrade::Allowed-Origins」のところでアップデート対象のパッケージを指定する。が、なんだか見たことない記述だ。

この記述は、「/var/lib/apt/lists/」の下にある「〜_InRelease」というファイルと対応している。例えば上記に対応するのは、Ubuntu 18.04LTS (Bionic) であれば、「archive.ubuntu.com_ubuntu_dists_bionic_InRelease」というファイルの以下の記述が対応する。このファイル名はaptが参照しているサーバーによって変わるかもしれない。以下は抜粋。

Origin: Ubuntu
Label: Ubuntu
Suite: bionic
Version: 18.04
Codename: bionic

「/etc/apt/apt.conf.d/50unattended-upgrades」の「${distro_id}」と「${distro_codename}」はなんらかのマクロだろうと想像できるが、まあ順当に考えて${distro_id}はディストリビューションのID例えば「Ubuntu」に、「${distro_codename}」はバージョンコードネーム、Ubuntu-18.04LTSなら「bionic」に展開されると考えて良い。

で、それぞれが「archive.ubuntu.com_ubuntu_dists_bionic_InRelease」のどこにあたるかというと、「Origin」と「Suite」の記述が該当すると思って良いようだ。これはなんらかのドキュメントを読んだわけではなく、トライ&エラーの経験則である。

例えばここで、いろいろなバージョンのPHPを導入できるPPA、「ppa:ondrej/php」を導入していたとする。

「/var/lib/apt/lists/」の下に「ppa.launchpad.net_ondrej_php_ubuntu_dists_bionic_InRelease」というカンジファイルがあるはずなので覗いてみよう。以下は抜粋。

Origin: LP-PPA-ondrej-php
Label: ***** The main PPA for supported PHP versions with many PECL extensions *****
Suite: bionic
Version: 18.04
Codename: bionic

この「Origin」と「Suite」の値を「/etc/apt/apt.conf.d/50unattended-upgrades」の「Unattended-Upgrade::Allowed-Origins」に指定すれば良い。従って

        "LP-PPA-ondrej-php:bionic";

でもいいが、せっかくマクロというか変数みたいなものをが使えることがわかっているので

        "LP-PPA-ondrej-php:${distro_codename}";

とすればよりスマートだろう。

ところで、サーバー監視ツールZabbixのオフィシャルパッケージをオフィシャルサイトの手順通りにインストールすると、「/var/lib/apt/lists/」の下に「repo.zabbix.com_zabbix_4.0_ubuntu_dists_bionic_InRelease」というカンジのファイルがあって、以下のような記述になっているハズだ。

Origin: Zabbix
Label: zabbix
Codename: xenial

「Suite」 の指定がない。こういう場合は指定しなくて良い。「/etc/apt/apt.conf.d/50unattended-upgrades」の「Unattended-Upgrade::Allowed-Origins」には以下のように記述する。

        "Zabbix:";

動作確認は以下のように行う。

sudo unattended-upgrade --dry-run -v -d

さて、前述のとおりDebian (Raspbian)-9(Stretch) に含まれているunattended-upgrades-0.93では指定の仕方が違うのだが、その方法は「/etc/apt/apt.conf.d/50unattended-upgrades」の中に詳しく書いてある (英語)。以下抜粋。

//   a,archive,suite (eg, "stable")
//   c,component     (eg, "main", "crontrib", "non-free")
//   l,label         (eg, "Raspbian", "Raspbian-Security")
//   o,origin        (eg, "Raspbian", "Unofficial Multimedia Packages")
//   n,codename      (eg, "jessie", "jessie-updates")
//     site          (eg, "http.Raspbian.net")

で、例えばRaspbianのRaspberry Pi Foundationが配布している専用パッケージは、「/var/lib/apt/lists/」の下にある「archive.raspberrypi.org_debian_dists_stretch_InRelease」というファイルで以下のようになっている。一部抜粋。

Origin: Raspberry Pi Foundation
Label: Raspberry Pi Foundation
Suite: stable
Codename: stretch

なので、「Origin」と「Codename」を指定することにすると以下のように「/etc/apt/apt.conf.d/50unattended-upgrades」の「Unattended-Upgrade::Allowed-Origins」に書いておけば良いだろう。

        "o=Raspberry Pi Foundation,n=${distro_codename}";

 

コメント