如何在 cloud-init 脚本中下载并安装常规 DPKG 包?

如何在 cloud-init 脚本中下载并安装常规 DPKG 包?

我正在使用 LXD/LXC 在 Linux 主机上启动轻量级容器。

这些容器的唯一目的是托管“Dotnet 和 Dotnet 核心应用程序”

有一段时间我一直在使用 Ansible,但最近我发现我实际上可以将一个初始化脚本嵌入到容器配置的用户数据中,然后 cloud-init 就会执行它。

这非常棒,除了一个问题之外,它允许我为给定的容器设置它所需的确切软件包。

微软

(我知道,我知道......别开玩笑和诽谤了:-D)

与大多数第三方软件包提供商不同,MS 将其整个 deb 源和 GPG 密钥打包在独立的 dpkg 软件包文件中,该软件包文件未通过常规 repos 列出,因此基本上必须通过“wget”下载,然后使用常规 dpkg 命令进行安装。

目前,我做事的方式如下:

#cloud-config

# apply updates using apt
package_update: true
package_upgrade: true

# set hostname
hostname: ****
fqdn: ****
manage_etc_hosts: true

# Install 3rd party software repos
# NOTE: This is done using run command due to the way microsoft distribute things using a raw dpkg
runcmd:
  - [wget, "https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb", -O, /root/packages-microsoft-prod.deb]
  - dpkg -i /root/packages-microsoft-prod.deb
  - rm /root/packages-microsoft-prod.deb
  - apt update
  - apt-get install dotnet-sdk-3.1 -y
  - apt-get install dotnet-sdk-5.0 -y

# Install standard packages
packages:
  - apt-transport-https
  - python3
  - python-is-python3
  - mc
  - gnupg
  - nginx
  - git

# Add users
users:
  - name: ****
    ssh-authorized-keys:
      - ssh-rsa **** rsa-key-BLAH
    sudo: ['****']
    groups: sudo
    shell: /bin/bash

final_message:
  - "Container initialisation complete."

关键部分是“runcmd”部分。

因为我使用的是“runcmd”,所以它会在所有其他操作之后运行,包括我放入所有需要使用的标准包的常规包安装部分。

我最理想的做法是安装 dpkg 文件,然后只需在普通包部分添加要安装的包名称,例如

# Something here to download and install the dpkg

# Install standard packages
packages:
  - apt-transport-https
  - python3
  - python-is-python3
  - mc
  - gnupg
  - nginx
  - git
  - dotnet-sdk-3.1
  - dotnet-sdk-5.0

我确实尝试过只将该位放入 runcmd 中,但由于它作为最后一步运行,由于没有安装 dotnet 的 repo,导致包部分失败。

我还尝试使用“Apt”模块,将“microsoft-prod.list”安装到“/etc/apt/sources.list.d”中,但也失败了,因为 MS 没有发布他们的 GPG 密钥,并且由于它是不受信任的来源,因此在执行 apt 更新时添加源会导致失败。

我已经搜索了 cloud-init 的模块文档,但找不到任何似乎表明可以下载和添加常规 dpkg 文件的内容,这就是为什么我在这里询问 :-)

答案1

您目前的做法似乎是最好的方法。目前没有专门用于安装单个 deb 的模块。

答案2

微软发布有关其 Linux 存储库的信息这里,包括如何获取他们的 gpg 密钥

以下配置应添加 Ubuntu 20.04 的 Microsoft 存储库

apt:
    preserve_sources_list: true
    sources:
        microsoft:
            keyserver: https://packages.microsoft.com/keys/microsoft.asc
            keyid: BC52 8686 B50D 79E3 39D3 721C EB3E 94AD BE12 29CF
            source: 'deb https://packages.microsoft.com/ubuntu/20.04/prod focal main'

答案3

对 Mart10 给出的答案的最后一行进行一点调整:“focal main”重复

apt:
    preserve_sources_list: true
    sources:
        microsoft:
            keyserver: https://packages.microsoft.com/keys/microsoft.asc
            keyid: BC52 8686 B50D 79E3 39D3 721C EB3E 94AD BE12 29CF
            source: 'deb https://packages.microsoft.com/ubuntu/20.04/prod focal main'

相关内容