Ubuntu Weekly Recipe

第485回 aptlyで本格的なパッケージリポジトリを作る

この記事を読むのに必要な時間:およそ 11 分

Ubuntuのパッケージリポジトリのスナップショットを作成したり,独自パッケージリポジトリを作成したいならaptlyが便利です。今回はこのaptlyの使い方について紹介します。

パッケージリポジトリの管理ツールである「aptly」

aptly「パッケージリポジトリの管理ツール」と題した,独自パッケージのリポジトリや部分的なミラーリポジトリを作成・管理するためのCLIツールです。具体的には次のような機能を提供します。

  • 公式パッケージリポジトリのパッケージすべてもしくは一部のミラーリング
  • パッケージリポジトリのスナップショットの作成
  • ローカルパッケージリポジトリの作成
  • リポジトリ間のマージ・更新
  • HTTP経由で作成したリポジトリを公開
  • REST APIを使ったリポジトリの操作

フルミラーも可能ではありますが,リポジトリのメタデータを署名するために使用するGPG鍵は公式リポジトリと異なる鍵を生成・利用します。このため「jp.archive.ubuntu.com」のような公式のミラーリポジトリとは異なり,作成したリポジトリを利用する場合は,PPAのような非公式リポジトリのようにGPG鍵をapt-keyコマンドで取り込まなければならないことに注意が必要です。

リポジトリのスナップショット機能は,多数のマシンに構成管理ツールなどを用いて環境を構築する際に真価を発揮するでしょう。一般的に通常のUbuntuリポジトリは,ディストリビューション側(リポジトリ側)の都合にあわせて任意のタイミングでパッケージが更新されます。つまり同じようにインストールしたとしてもタイミングによってインストールされるパッケージのバージョンが異なってしまう可能性が存在します。構成管理ツールを用いてバージョン指定でパッケージをインストールする方法もありますが,そのバージョンのパッケージファイルがいつまでリポジトリに存在するかはリポジトリのポリシー次第です。よって複数台のマシンの環境を完全に合わせるのであれば,ローカルにパッケージのスナップショットを作成する必要があります。aptlyを使えば,これを簡単に実現できるのです。

ローカルパッケージリポジトリの作成は,独自にDebianパッケージを作成しそれを特定のネットワーク環境内部にのみ公開したい場合に便利です。Ubuntuの場合はPPAを使うという手が存在するものの,アーキテクチャに縛りがあったり,非公開リポジトリを作る場合は有料だったりと,いくつかの制約が存在します。マシン内で閉じた簡易的なリポジトリでよければdpkgコマンドやapt-ftparchiveコマンドを使って構築することも可能ではありますが,提供するパッケージ数が増えてきたり,ネットワーク越しに公開したい場合に手間がかかります。aptlyを使えば,ミラーやスナップショットと同じ要領でローカルパッケージの提供が行えますし,部分的に公式リポジトリの内容をマージすることも可能です。

まだ実験的ではありますが,REST APIを用いてリポジトリの操作を行えます。CIツールと組み合わせてテストが通ったパッケージを自動的にリポジトリに追加する際に役に立つことでしょう。

単に公式パッケージのミラーサイトを作りたいだけであれば,第47回の後半で紹介しているapt-mirrorが存在します。こちらはフルミラーですのでストレージのリソースをそれなりに使用するものの,リポジトリのメタデータやパッケージの署名は公式の状態をそのまま維持するため,apt-keyによる鍵の追加は不要になるというメリットがあります。また,実際にインストールするパッケージのみキャッシュしたいということであれば,第315回で紹介したapt-cacher-ngが便利です。こちらはsources.listを変更する必要すらなく,プロキシサーバーを指定する要領で構築したキャッシュを利用できます。

どちらのツールもaptlyほど柔軟な管理は行えませんが,設定や環境構築がシンプルというメリットがあります。目的・用途に応じて使い分けるとよいでしょう。

aptlyのインストール

aptlyのパッケージは公式リポジトリにも存在しますが,Ubuntu 16.04 LTSで0.9.6,開発中の17.10で1.0.1と最新の1.1.1に比べると若干古いです。特に16.04上で運用するとなると,1.x系にあげておきたいところでしょう。そこで今回は公式サイトのリポジトリからインストールすることにします。

$ wget -qO - https://www.aptly.info/pubkey.txt | sudo apt-key add -
$ echo "deb http://repo.aptly.info/ squeeze main" | sudo tee /etc/apt/sources.list.d/aptly.list
$ sudo apt update
$ sudo apt install aptly

DebianとUbuntuで同じパッケージなので,リポジトリのURL部分はUbuntuであってもsqueezeのままでかまいません。

aptlyを運用するためにはリポジトリ用のGPG鍵が必要になります。普段使っているGPG鍵でも実装上は問題ありませんが,リポジトリ用に別の鍵を作るほうが無難です。またリポジトリ用のデータベースはaptlyを実行したユーザーのホームディレクトリに作られるため,aptly専用のユーザーを作ることも考えたほうがいいでしょう※1)⁠可能であればLXDのようにコンテナの中に閉じ込めてしまいましょう。今回はaptlyユーザーを作って,その中で作業を行います。

※1
公開するリポジトリのディレクトリそのものはホームディレクトリの外に作ることも可能です。リポジトリとして外部からアクセスするのは,このリポジトリディレクトリのみであり,aptlyが作ったリポジトリ用のデータベースに外部からアクセスすることはありません。
$ sudo adduser aptly
ユーザー `aptly' を追加しています...
新しいグループ `aptly' (1001) を追加しています...
新しいユーザー `aptly' (1001) をグループ `aptly' に追加しています...
ホームディレクトリ `/home/aptly' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
Changing the user information for aptly
Enter the new value, or press ENTER for the default
        Full Name []: aptly
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
以上で正しいですか? [Y/n]

aptlyユーザーに切り替えて,GPG鍵を生成します。標準的な選択肢をそのまま選んでいけば問題ありません。

$ sudo -iu aptly
$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: ディレクトリ「/home/aptly/.gnupg」ができました
gpg: 新しい構成ファイル「/home/aptly/.gnupg/gpg.conf」ができました
gpg: *警告*: 「/home/aptly/.gnupg/gpg.conf」のオプションは起動している間,有効になりません
gpg: 鍵リング「/home/aptly/.gnupg/secring.gpg」ができました
gpg: 鍵リング「/home/aptly/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
選択は?
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
(null)は無期限です
これで正しいですか? (y/N) y

あなたの鍵を同定するためにユーザIDが必要です。
このソフトは本名,コメント,電子メール・アドレスから
次の書式でユーザIDを構成します:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

本名: aptly
電子メール・アドレス: aptly@example.com
コメント:
次のユーザIDを選択しました:
    "aptly <aptly@example.com>"

名前(N),コメント(C),電子メール(E)の変更,またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。
(中略)
gpg: /home/aptly/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵C6D7028Bを究極的に信用するよう記録しました
公開鍵と秘密鍵を作成し,署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3,最小の「全面的信用」1,PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/C6D7028B 2017-08-17
      フィンガー・プリント = A6D2 FEF3 B835 CA7E 809F  35A9 2F19 39DF C6D7 028B
uid                  aptly <aptly@example.com>
sub   2048R/B36DF2F0 2017-08-17

これでaptlyを使う準備が整いました。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入