apt-key已被宣布为废弃,但在Ansible中该如何书写?

虽然apt-key已被废弃,但在Ansible中应该如何编写?

简言之

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的下一个版本中消失。

从apt-key的man页面中取得

apt-key的使用已被弃用,除了在维护脚本中使用apt-key del来从主密钥环中删除现有密钥外。如果需要使用apt-key,还需要额外安装GNU隐私保护套件(打包在gnupg中)。
apt-key(8)将在Debian 11和Ubuntu 22.04中最后可用。

我个人使用的Ansible playbook以apt_key模块安装了docker和kubernetes,但我决定改用其他方法。

在调查中发现了将密钥放置在/etc/apt/trusted.gpg.d的例子,但是这会导致其他仓库也变得有效,这是不希望的。因此,我们会将密钥放在另一个位置,并在sources中使用signed-by来指定密钥。

由于Docker Engine的官方安装步骤和kubeadm的官方安装步骤都使用了/etc/apt/keyrings作为密钥存放位置,所以我们将使用此位置。

文本格式的钥匙

Docker的GPG密钥以文本形式分发。
根据官方步骤, 可以使用gpg –dearmor -o /etc/apt/keyrings/docker.gpg将其转换为二进制格式并存储,
但如果保存为扩展名.asc(ASCII装甲),则可以直接使用。

因此,在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

为了指定架构,我们将准备以下变量,并使playbook能够引用。

deb_architecture: {
  "armv6l": "armhf",
  "armv7l": "armhf",
  "aarch64": "arm64",
  "x86_64": "amd64",
  "i386": "i386"
}
    architectureの指定はこちらを参考にしました

二进制格式的密钥

Kubernetes的GPG密钥是以二进制形式提供的。
因此,将其保存为*.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的执行,所以请注意。

bannerAds