apt-key
が非推奨になったけどAnsibleではどう書けばいいのか
TL;DR
-
get_url
でgpg keyを適切な場所に置く-
/etc/apt/trusted.gpg.d
は望ましくない - 適切な場所として
/etc/apt/keyrings
や/usr/local/share/keyrings
が考えられる-
apt_repository
のrepoで[signed-by=<パス>]
を指定する
-
-
- テキスト形式の鍵は
*.asc
、バイナリ形式の鍵は*.gpg
という名前で保存する
環境
- Debian 11
背景
apt-key
コマンドは非推奨であり、Debian 11とUbuntu 22.04の次のバージョンから消えるらしいです。
Use of apt-key is deprecated, except for the use of apt-key del in maintainer scripts to remove existing keys from the main keyring. If such usage of apt-key is desired the additional installation of the GNU Privacy Guard suite (packaged in gnupg) is required.
apt-key(8) will last be available in Debian 11 and Ubuntu 22.04.
個人的に運用しているAnsible playbookにてdockerとkubernetesのインストールをapt_key
モジュールで行っていましたが、
これを使わない方法に改めることにしました。
調べてみると/etc/apt/trusted.gpg.d
に鍵を置く例が見つかりましたが、
これはapt-key add
と同じように他のリポジトリでも有効になってしまうので望ましくありません。
そこで、別の場所に鍵を置き、sources内のsigned-by
で鍵を指定します。
鍵の置き場所として、Docker Engineの公式インストール手順、kubeadmの公式インストール手順ではいずれも/etc/apt/keyrings
を使っているので、ここを使用することにします。
テキスト形式の鍵
DockerのGPG keyはテキスト形式で配布されていました。
公式手順ではgpg --dearmor -o /etc/apt/keyrings/docker.gpg
によって、バイナリ形式に変換してから格納していますが、
.asc
(ascii armor)という拡張子で保存すればそのまま使えます。
従って、Ansibleでは次のようにします。
- name: Add docker gpg key
get_url:
url: https://download.docker.com/linux/debian/gpg
dest: /etc/apt/keyrings/docker.asc
mode: '0644'
force: true
- name: Add docker apt repository
apt_repository:
repo: deb [arch={{ deb_architecture[ansible_architecture] }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/{{ ansible_system | lower }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable
state: present
architectureを指定するために、次のような変数を用意し、playbookから参照できるようにします。
deb_architecture: {
"armv6l": "armhf",
"armv7l": "armhf",
"aarch64": "arm64",
"x86_64": "amd64",
"i386": "i386"
}
- architectureの指定はこちらを参考にしました
バイナリ形式の鍵
kubernetesのGPG keyはバイナリ形式でした。
従って、*.gpg
という拡張子で保存します。
- name: Add kubernetes gpg key
get_url:
url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
dest: /etc/apt/keyrings/kubernetes-archive-keyring.gpg
mode: '0644'
force: true
- name: Add kubernetes apt repository
apt_repository:
repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main"
state: present
その他
apt-key
には関係ないですが、失効した鍵があるとapt update
時に失敗するので、鍵の更新をapt update
が走る前に行っておく必要があります。
apt
モジュールでupdate_cache: true
になっている場合や、apt_repository
モジュールのデフォルト動作でapt update
がかかるのを見落としがちなので、気をつけます。