添加 Google Cloud SDK apt 存储库签名密钥的 Ansible 任务

Ansible tasks for adding the Google Cloud SDK apt repository signing key

我正在尝试下载并安装 Google Cloud SDK apt 存储库的签名密钥作为一组 Ansible 任务。 (即,将 here 概述的手动过程转换为 Ansible)。

这是我想出的:

- name: Install the Google Cloud SDK package repository signing key
  ansible.builtin.apt_key:
    url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
    keyring: /usr/share/keyrings/cloud.google.gpg

- name: Add Google Cloud SDK package repository source
  ansible.builtin.apt_repository:
    filename: google-cloud-sdk.list
    repo: "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main"
    update_cache: yes

但是,我的第一个任务失败了,出现了一个很大的 GnuPG 错误。这是 Ansible 失败 JSON:

{
  "changed": false,
  "msg": "Unable to extract key from '-'",
  "stderr": "gpg: WARNING: no command supplied.  Trying to guess what you mean ...\ngpg: [don't know]: invalid packet (ctb=0a)\n",
  "stderr_lines": [
    "gpg: WARNING: no command supplied.  Trying to guess what you mean ...",
    "gpg: [don't know]: invalid packet (ctb=0a)"
  ],
  "stdout": "pub:-:2048:1:FEEA9169307EA071:1614614617:1677728521::-:\nuid:::::::::Rapture Automatic Signing Key (cloud-rapture-signing-key-2021-03-01-08_01_09.pub):\nsub:-:2048:1:AA42F36EE8BEEE0E:1614614617::::\npub:-:2048:1:8B57C5C2836F4BEB:1607040606:1670154510::-:\nuid:::::::::gLinux Rapture Automatic Signing Key (//depot/google3/production/borg/cloud-rapture/keys/cloud-rapture-pubkeys/cloud-rapture-signing-key-2020-12-03-16_08_05.pub) <glinux-team@google.com>:\nsub:-:2048:1:48419E688DD52AC0:1607040606::::\n",
  "stdout_lines": [
    "pub:-:2048:1:FEEA9169307EA071:1614614617:1677728521::-:",
    "uid:::::::::Rapture Automatic Signing Key (cloud-rapture-signing-key-2021-03-01-08_01_09.pub):",
    "sub:-:2048:1:AA42F36EE8BEEE0E:1614614617::::",
    "pub:-:2048:1:8B57C5C2836F4BEB:1607040606:1670154510::-:",
    "uid:::::::::gLinux Rapture Automatic Signing Key (//depot/google3/production/borg/cloud-rapture/keys/cloud-rapture-pubkeys/cloud-rapture-signing-key-2020-12-03-16_08_05.pub) <glinux-team@google.com>:",
    "sub:-:2048:1:48419E688DD52AC0:1607040606::::"
  ]
}

如果我从 Google(使用 get_url)下载文件并以这种方式添加密钥——根据我对文档的理解,这似乎没有必要——它会继续,但是第二个任务失败了(因为找不到钥匙)。

我假设我错误地使用了 apt_keyapt_repository,但我不知道如何使用。可以这样做吗,还是只 shell 出来会更容易?

显然 apt-key 已弃用。我得到它的工作:

- name: Download the Google Cloud SDK package repository signing key
  ansible.builtin.get_url:
    url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
    dest: /etc/apt/trusted.gpg.d/gcloud.gpg

- name: Add Google Cloud SDK package repository source
  ansible.builtin.apt_repository:
    filename: google-cloud-sdk.list
    repo: "deb [signed-by=/etc/apt/trusted.gpg.d/gcloud.gpg] https://packages.cloud.google.com/apt cloud-sdk main"
    update_cache: yes

TL;DR(在 debian 11 上测试)- Xophmeister 解决方案的附录:

  • 对第 3 方 gpg 密钥使用 /usr/share/keyrings
  • 将 signed-by=/usr/share/keyrings/key.(gpg|asc) 放入 repo 定义中
  • 更喜欢二进制签名(.gpg 文件),但 ascii 装甲密钥似乎可以工作(只要扩展名是 .asc)
  • 无需安装gnupg(只要不使用apt-key命令即可)

虽然 Xophmeister 的回答似乎没问题,但它忽略了 apt-key 弃用的全部要点,即不再将第 3 方密钥添加到全局签名密钥列表中。 因此,我们的想法是创建一个新目录(/usr/share/keyrings、/usr/local/share/keyrings 等)并将所有第 3 方签名密钥放在那里,并只为官方 debian 存储库留下 trusted.gpg.d。

LE:/usr/share/keyrings 从 debian 9 开始(至少)出现在 debian 中,这是您应该放置密钥的默认位置;可能在将来 /etc/apt/trusted.gpg.d/ 将被弃用(即使是 debian 密钥,现在仅适用于第三方密钥)

对二进制密钥使用 .gpg(首选),对 ascii 装甲使用 .asc;尽管不推荐 ascii 装甲密钥,因为我们谈论的是 ansible playbook,很难(目前)编写好的代码(幂等方式)来获取 ascii 密钥并将其转换为二进制;当然,我想我们可以像以前一样使用 apt_key 模块并将目标设置在 /usr/share/keyrings 目录中;但只要它可能在后台使用 apt-key 脚本,这可能不是最佳选择

所以,使用 get_url 和 apt_repository 我能够添加一个 ascii 装甲密钥和带有 signed-by=/usr/share/keyrings/key.asc 的存储库;无需安装 gnupg; apt update 和 apt install 工作;建议使用二进制密钥,但似乎也适用于 ascii 装甲密钥