Cloud-init:从远程文件而不是从密钥服务器获取 apt 密钥

Mét*_*ule 2 cloud-init

我正在尝试使用 cloud-init 添加 InfluxDB(时间序列数据库)存储库。官方文档wget指出,要手动安装,必须首先使用(或)下载公钥curl

wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/ubuntu bionic stable" > /etc/apt/sources.list.d/influxdb.list
Run Code Online (Sandbox Code Playgroud)

效果很好,现在我想使用 cloud-init 自动执行此操作。

我的问题是我不知道如何在使用之前从提供的 URL 获取密钥。我试过这个:

apt:
  sources:
    influxdb:
      source: 'deb https://repos.influxdata.com/ubuntu $RELEASE stable'
Run Code Online (Sandbox Code Playgroud)

但随后我收到 GPG 错误,指出存储库未签名。

我尝试了以下keyserverkeyid键的组合但没有成功:

  • keyserver: https://repos.influxdata.com/influxdb.key
  • keyserver: https://repos.influxdata.comkeyid: influxdb.key
  • keyserver: https://repos.influxdata.comkeyid: 05CE15085FC09D18E99EFB22684A14CF2582E0C5

如何获取 GPG 密钥?我可以使用Runcmd,但如果有替代方案,我宁愿不使用。

Mét*_*ule 6

有两种可能:

  1. 您要导入的密钥存在于 Ubuntu 密钥服务器上
  2. Ubuntu 密钥服务器上不存在该密钥

检查您要导入的密钥是否是 Ubuntu 密钥服务器的一部分:

  • 从公钥中获取密钥ID
wget -qO- https://repos.influxdata.com/influxdb.key | gpg --with-fingerprint --with-colons | awk -F: '/^fpr/ { print $10 }'
Run Code Online (Sandbox Code Playgroud)
  • 检查是否可以从 Ubuntu 密钥服务器检索它
gpg --keyserver=keyserver.ubuntu.com --recv-keys 05CE15085FC09D18E99EFB22684A14CF2582E0C5
Run Code Online (Sandbox Code Playgroud)

密钥存在于 Ubuntu 密钥服务器上

如果存在,那么您只需将密钥 ID 添加到 cloud-init 文件中,并将存储库标记为由该密钥签名:

apt:
  sources:
    influxdb:
      keyid: 05CE15085FC09D18E99EFB22684A14CF2582E0C5
      source: 'deb [signed-by=$KEY_FILE] https://repos.influxdata.com/ubuntu $RELEASE stable'
Run Code Online (Sandbox Code Playgroud)

手动导入公钥

如果 Ubuntu 密钥服务器上不存在该密钥,可以使用以下runcmd命令手动导入它:

# fetch Influx GPG public key, and store it in the keyring
runcmd:
  - wget -qO- https://repos.influxdata.com/influxdb.key | sudo gpg --dearmor -o /usr/share/keyrings/influxdb.gpg

# add Influx apt source by marking it as signed with the added key
# (note the [signed-by] option)
apt:
  sources:
    influxdb:
      source: 'deb [signed-by=/usr/share/keyrings/influxdb.gpg] https://repos.influxdata.com/ubuntu $RELEASE stable'

Run Code Online (Sandbox Code Playgroud)

  • 至少在 ubuntu 的 cloud-init 23.1.1 上这似乎不起作用。我相信 runcmd 在 apt 之后运行。https://git.launchpad.net/cloud-init/tree/config/cloud.cfg.tmpl (2认同)