Я использую cloud-init для создания виртуальной машины Ubuntu 16.04 LTS в Azure. На сервере, который я хочу построить, будет работать программное обеспечение, установленное из настраиваемого репозитория.
Я использую runcmd
директива для добавления репозитория, обновления базы данных apt и установки пакета и его зависимостей:
runcmd:
- wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
- echo "deb http://nightly.odoo.com/10.0/nightly/deb/ ./" | tee /etc/apt/sources.list.d/odoo.list
- apt update
- apt install --assume-yes odoo
Затем я пишу собственный файл конфигурации, используя write_files
директива. Я не могу сделать это перед установкой программного обеспечения, поскольку наличие файла конфигурации вызывает интерактивный запрос во время установки.
Затем я хотел бы выполнить дополнительные команды (в частности, я хочу запустить certbot для установки сертификата Lets Encrypt). Я не смог найти способ сделать это.
Можно добавить второй набор runcmd
записи, но по умолчанию cloud-init игнорирует все, кроме последнего набора.
Есть решения для объединения нескольких наборов записей вместе. Однако затем все команды выполняются вместе, чего я не хочу.
Одним из очевидных решений было бы написать файл конфигурации с помощью команд оболочки, а не использовать write_files
директива, но на самом деле я чувствую, что плыву вверх по течению со всем своим подходом, и что, возможно, есть более простое решение для довольно распространенного требования.
Любой вклад приветствуется.
Это не решает конкретную проблему запуска команд оболочки в разных точках во время выполнения cloud-init, однако решение моей проблемы заключалось в использовании встроенных функций для добавления подходящих источников:
https://cloudinit.readthedocs.io/en/latest/topics/examples.html#additional-apt-configuration
Я думаю, что более общий ответ - использовать модуль для всего, что вы можете, использовать runcmd, когда вам нужно, и, если вам нужны оба, напишите свой собственный модуль облачной инициализации.