Apt

如何在 cloud-init 腳本中下載和安裝正常 DPKG 包?

  • April 19, 2022

我正在使用 LXD/LXC 在 Linux 主機上建構輕量級容器。

這些容器的唯一目的是託管“Dotnet 和 Dotnet 核心應用程序”

有一段時間我一直在使用 Ansible,但最近我發現我實際上可以將一個 init 腳本嵌入到容器配置的使用者數據中,然後 cloud-init 會執行它。

這很棒,並且允許我設置一個給定的容器,其中包含它需要的包,除了一個問題。

微軟

(我知道,我知道……保存笑話和誹謗:-D)

與大多數第 3 方軟體包提供商不同,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 文件的內容,因此我在這裡問:-)

你目前正在做的方式似乎是最好的方式。目前沒有專門用於安裝單個 deb 的模組。

微軟在這裡發布了關於其 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'focal main'

引用自:https://serverfault.com/questions/1082073