Рейтинг:0

Как передать облачный конфиг в LXD?

флаг it

Я был на бесчисленных сайтах, включая этот, пытаясь понять, как заставить LXD запускать облачную конфигурацию, когда я запускаю свой контейнер LXD. В некоторых местах рекомендуют настроить профиль (не работает). Другие рекомендуют перенаправить файл YAML в команду lxc (не сработало), а другие рекомендуют использовать команду --config option и передать файл таким образом (не сработало). В некоторых местах говорят, что я должен добавить #cloud-config к моему конфигу, другие не заморачиваются. Некоторые даже рекомендуют использовать файл XML. Очевидно, мне не хватает какой-то важной части информации, которую все остальные делают по умолчанию, но я не могу понять, что это такое.

Мой обновленный «простой пример», который пытается установить дерево и пытается коснуться /run/cloud-config-did-run:

lxc удалить -f х

кошка << EOF >config.yml
#cloud-config
вывод: {все: '| tee -a /var/log/my-cloud-init-output.log'}
пакет_обновление: правда
package_upgrade: правда
package_reboot_if_required: правда
пакеты:
  - дерево
выполнить команду:
  - коснитесь /run/cloud-config-did-run
EOF

lxc запускает Ubuntu: x --config=user.user-data="$(cat config.yml)"
спать 5
lxc exec x -- bash -c "ls /run"
lxc exec x -- bash -c "дерево /etc"

Вывод НАПРАВЛЯЕТСЯ на /var/log/my-cloud-init-output.log, поэтому он обрабатывается, но ничего, кроме вывод директива работает (в журналах даже не упоминаются какие-либо другие запущенные вещи или какие-либо ошибки - только стандартный материал SSH keygen).

Может отступ неправильный? Или конфиг не в том поддереве? Или не хватает какого-то магического значения? Версия LXD, где это сломано? (У меня версия 4.20). Я занимаюсь этим уже 10 часов, и независимо от того, что я делаю, моя облачная конфигурация полностью игнорируется (ни ошибок, ни журналов, ни записей о том, что что-то работает, ни записей о том, что я когда-либо давал указания делать что-либо, кроме стандартный материал ssh keygen, который, по-видимому, испечен). Может ли кто-нибудь превратить приведенное выше в рабочий пример, который гарантированно запустится, если я просто вставлю его в оболочку?

djdomi avatar
флаг za
я не уверен, но что вы пытаетесь сделать или исправить?
флаг it
Я пытаюсь заставить его автоматически запускать команду внутри контейнера LXD при его запуске. Даже на самом деле я хочу, чтобы он автоматически устанавливал некоторые пакеты, но сейчас я просто хочу, чтобы что-то работало.
флаг jp
Вы проверили `/var/log/cloud-init.log`?
флаг it
Да. Вот откуда берется приведенная выше запись в журнале. Нет никаких записей об ошибках или чего-либо, что могло бы предположить, что что-то пойдет не так.
флаг jp
В документации модуля `cloud-init` `runcmd` есть примечание: «при записи файлов не используйте /tmp dir, так как он работает с systemd-tmpfiles-clean LP: #1707222. Вместо этого используйте /run/somedir».
флаг it
Установка пакетов и вывод текста состояния тоже не работает. Я просто использовал это как пример, потому что буквально ничего не работает.
флаг jp
Вы можете попробовать добавить `output: {all: '| tee -a /var/log/cloud-init-output.log'}` в `config.yml`. Это должно немного помочь с отладкой.
флаг it
Обновлено, чтобы использовать /run, а также пытаться что-то установить. Как ни странно, директива `output` соблюдается, но больше ничего, и ничего необычного в логах не появляется.
флаг jp
Вы, вероятно, захотите проверить, распознает ли `cloud-init`, что он запускается на этапе `первой загрузки`. Если я правильно помню, он пропускает большинство модулей после первой загрузки.
флаг it
Как бы я это сделал? Я пришел к этому совершенно новому, поэтому я следил за блогами и инструкциями, но ни один из них не работал, и ни один из них не говорит, как устранять неполадки, потому что это должно быть таким тривиальным... Я действительно не понимаю. не понимаю, как он мог так эффектно потерпеть неудачу даже на двух отдельных системах (одна работает под управлением Ubuntu, другая - под управлением nixos)
флаг it
Вот почему я надеюсь, что кто-нибудь запустит что-то тривиальное, которое работает в их системе, а затем опубликует это здесь, чтобы я мог проверить, что что-то работает в другом месте.
Рейтинг:0
флаг in

Доступная (не-) информация об облачной конфигурации действительно доставляет неудобства. И документы все еще плохие. Но обо всем по порядку:
Я попробовал именно ваш код и преуспел (обновления пакета + /run/cloud-config-did-run работал). Протестировано с Убунту 20.04 а также 22.04.

НО, я работаю над ЛСД 5.1. Так что это может быть важным ключевым отличием.


Некоторые замечания, которые могут быть полезны:

  • Я настраиваю простой вывод, чтобы различать этапы init, config, final и, таким образом, стандартный журнал и ошибки. Это упрощает отладку.

    вывод:
      init: ["> /tmp/cloud-init.log", "> /tmp/cloud-init.err"]
      config: [ "> /tmp/cloud-init-config.log", "> /tmp/cloud-init-config.err" ]
      final: [ "> /tmp/cloud-init-final.log", "> /tmp/cloud-init-final.err" ]
    
  • Как только я выстрелил запуск lxc команда
    Я переодеваюсь в контейнер с lxc оболочка х.
    С состояние облачной инициализации --wait Смотрю, все ли работает ("сделано") или не работает.
    Если это не удается /tmp/*.ошибка твой друг

  • До сих пор у меня никогда не было проблем с написанием /tmp. Cloud-init изменил порядок выполнения где-то в прошлом. Это, возможно, решило это.

  • бесполезные знания: package_update входит в package_upgrade

  • #cloud-config нужно. Пробовал без, не получилось. YAML вообще игнорировался

  • О формат облачной конфигурации: это YAML (расширение файла не имеет значения).Я не думаю, что что-то еще работает для LXD, кроме многокомпонентного архива MIME.

  • Архивы MIME, состоящие из нескольких частей, работают с LXD, и это хороший способ повторного использования кода для разных конфигураций. Его легко использовать, но документы кажутся рудиментарными.
    Небольшой пример с вашим config.yml вместе со сценарием оболочки:

    кошка << EOF >test.sh
    #!/usr/bin/env bash
    touch /run/здесь-мы-идем-с-оболочкой-скриптом
    EOF
    
    cloud-init devel make-mime -a config.yml:cloud-config -a test.sh:x-shellscript-per-once > newconfig
    lxc запустить ubuntu:j f --config=user.user-data="$(cat /root/newconfig)"
    lxc оболочка f
    состояние облачной инициализации --wait
    лс /выполнить
    

    Хорошей отправной точкой для работы с многочастными архивами MIME, вероятно, является страница документа cloudinit

  • Профили LXD с облачной конфигурацией работали, когда мы их тестировали, но мы их не используем.

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

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

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