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

问题描述 投票:0回答:2

我正在尝试下载并安装 Google Cloud SDK apt 存储库的签名密钥作为一组 Ansible 任务。 (即将此处概述的手动流程转换为 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) <[email protected]>:\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) <[email protected]>:",
    "sub:-:2048:1:48419E688DD52AC0:1607040606::::"
  ]
}

如果我从 Google 下载文件(使用

get_url
)并以这种方式添加密钥(根据我对文档的理解,这似乎没有必要),它会进行,但第二个任务会失败(因为密钥的未找到)。

我认为我错误地使用了

apt_key
apt_repository
,但我不知道如何使用。这样可以吗,还是直接掏钱比较容易?

google-cloud-platform ansible apt
2个回答
7
投票

显然

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

6
投票

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

  • 使用 /usr/share/keyrings 作为第 3 方 gpg 密钥(/etc/apt/keyrings 用于 debian 12+,为了保持一致性,也在下面)
  • 将signed-by=/usr/share/keyrings/key.(gpg|asc)放入repo定义中
  • 更喜欢二进制签名(.gpg 文件),但 ascii 装甲密钥似乎可以工作(只要扩展名是 .asc)
  • 无需安装 gnupg(只要不使用 apt-key 命令)

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

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

从 debian 12 开始,正确的目录应该是 /etc/apt/keyrings debian 11 及更低版本不附带该目录,因此为了保持一致,您必须将该目录创建为 root/root/0775 (感谢@starfish提供的信息!)

使用 .gpg 表示二进制密钥(首选),使用 .asc 表示 ascii 装甲;尽管不推荐使用 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 装甲密钥一起使用

© www.soinside.com 2019 - 2024. All rights reserved.