我正在尝试下载并安装 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
,但我不知道如何使用。这样可以吗,还是直接掏钱比较容易?
显然
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 解决方案的附录:
虽然 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 装甲密钥一起使用