Рейтинг:1

Как загрузить и установить обычный пакет DPKG в скрипте cloud-init?

флаг in

Я раскручиваю легкие контейнеры на хосте Linux, используя LXD/LXC.

Единственной целью этих контейнеров является размещение «основных приложений Dotnet и Dotnet».

Некоторое время я использовал Ansible, но недавно обнаружил, что могу встроить скрипт инициализации в пользовательские данные конфигурации контейнера, и cloud-init выполнит его.

Это здорово, и позволяет мне настроить данный контейнер именно с теми пакетами, которые ему нужны, за исключением одной проблемы.

Майкрософт

(Знаю, знаю... приберегите шутки и оскорбления :-D)

В отличие от большинства сторонних поставщиков пакетов, MS упаковывает все добавление своего источника deb и ключа GPG в отдельный файл пакета dpkg, этот файл пакета не указан в обычных репозиториях, поэтому его в основном необходимо загрузить с помощью «wget», а затем установить. используя обычную команду dpkg.

Прямо сейчас, вот как я делаю вещи:

#cloud-config

# применить обновления с помощью apt
пакет_обновление: правда
package_upgrade: правда

# установить имя хоста
имя хоста: ****
полное доменное имя: ****
manage_etc_hosts: правда

# Установите репозитории сторонних программ
# ПРИМЕЧАНИЕ. Это делается с помощью команды запуска из-за того, что Microsoft распространяет вещи с помощью необработанного dpkg
выполнить команду:
  - [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-get установить dotnet-sdk-3.1 -y
  - apt-get установить dotnet-sdk-5.0 -y

# Устанавливаем стандартные пакеты
пакеты:
  - apt-транспорт-https
  - питон3
  - питон-это-питон3
  - МС
  - гнупг
  - нгинкс
  - мерзавец

# Добавить пользователей
пользователи:
  - имя: ****
    ssh-авторизованные ключи:
      - ssh-rsa **** rsa-key-BLAH
    судо: ['****']
    группы: судо
    оболочка: /bin/bash

финальное_сообщение:
  - «Инициализация контейнера завершена».

Ключевой частью является раздел «runcmd».

Поскольку я использую «runcmd», он запускается ПОСЛЕ всего остального, включая обычную часть установки пакета, где я помещаю все стандартные пакеты, которые мне нужно использовать.

В идеале я ХОЧУ установить файл dpkg, а затем просто добавить имена пакетов для установки в обычную часть пакета, например

# Что-то здесь для загрузки и установки dpkg

# Устанавливаем стандартные пакеты
пакеты:
  - apt-транспорт-https
  - питон3
  - питон-это-питон3
  - МС
  - гнупг
  - нгинкс
  - мерзавец
  - dotnet-sdk-3.1
  - dotnet-SDK-5.0

Я пытался ТОЛЬКО поместить этот бит в runcmd, но поскольку он выполняется как самый последний шаг, это приводит к сбою части пакетов из-за отсутствия установленного репо для dotnet.

Я также пытался использовать модуль «Apt», чтобы установить «microsoft-prod.list» в «/etc/apt/sources.list.d», но это также не удалось, потому что MS не публикует свой ключ GPG и добавление источника вызывает сбой при выполнении подходящего обновления из-за того, что он является ненадежным источником.

Я просмотрел документацию модуля для cloud-init и не могу найти ничего, что, по-видимому, предполагает загрузку и добавление обычного файла dpkg, поэтому я спрашиваю здесь :-)

флаг in
Если вам нужны эти пакеты во всех ваших контейнерах, вы можете просто добавить пакеты прямо в образ.
флаг in
Другой вариант — вручную добавить пакеты Microsoft в файл .deb.
флаг in
@GeraldSchneider - да, я думал об этом, но, к сожалению, эти контейнеры не всегда будут одной и той же базой. Прямо сейчас я использую ubuntu: 20.04, но он организован через веб-интерфейс, где разработчики, использующие их, могут выбирать живые базовые образы от Alpine до Arch, Ubuntu и всего, что между ними. Кроме того, да, я тоже собирался попробовать это, но я не могу вспомнить, как получить содержимое файла deb :-)
флаг sa
То, что вы сейчас делаете, кажется лучшим. В настоящее время нет модуля, предназначенного для установки отдельных deb-файлов.
флаг in
@falcojr Нет проблем, не стесняйтесь добавить это в качестве ответа, и я приму это. Это стоило спросить на всякий случай, если кто-то знал что-то, чего не знал я :-) Возможно, мне просто придется вернуться к использованию Ansible для некоторых вещей.
Рейтинг:1
флаг cn

Microsoft публикует информацию о своих репозиториях Linux здесь, это включает в себя, как получить их ключ gpg

Следующая конфигурация должна добавить репозиторий Microsoft для Ubuntu 20.04.

подходящий:
    save_sources_list: правда
    источники:
        Майкрософт:
            сервер ключей: https://packages.microsoft.com/keys/microsoft.asc
            идентификатор ключа: BC52 8686 B50D 79E3 39D3 721C EB3E 94AD BE12 29CF
            источник: 'deb https://packages.microsoft.com/ubuntu/20.04/prod focus main'focal main'
флаг in
Прикольно... обязательно попробую :-)
Mart10 avatar
флаг cn
@shawty Следует отметить, что в исходном сценарии вы используете «https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb» в качестве ссылки на репозиторий пакетов, но когда я написал это ответ, ссылка у меня не работает, я думаю, что она устарела. Новый - это тот, который указан в официальной документации, на которую я ссылаюсь.
флаг in
Меня бы это не удивило.... Мне пришлось обновить многочисленные сообщения в блогах, которые я делал на jenkins на протяжении многих лет, именно по этой причине.... ключ GPG постоянно меняется... :-(
Рейтинг:1
флаг sa

То, что вы сейчас делаете, кажется лучшим. В настоящее время нет модуля, предназначенного для установки отдельных deb-файлов.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.