Я хочу автоматически установить apache2 на мой экземпляр EC2 при первой загрузке. Я использую базовый образ Ubuntu 16.04 LTS:

ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180522 (ami-a4dc46db)

Мой скрипт пользовательских данных ниже:

#!/bin/bash
apt-get update && apt-get upgrade -y
apt-get install apache2 -y

После входа в систему и терпеливого ожидания я обнаружил, что apache2 не устанавливается. Поскольку этот скрипт запускается от имени пользователя root, я не мог видеть вывод, как если бы я запускал его вручную, поэтому я перенаправил весь вывод в файл журнала.

#!/bin/bash
apt-get update && apt-get upgrade -y &>/var/log/erich

Вот часть, которая зависает, ожидая ввода пользователя:

Setting up console-setup (1.108ubuntu15.4) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
Configuring console-setup
-------------------------


  1. ARMSCII-8         8. ISIRI-3342    15. ISO-8859-16  22. ISO-8859-8
  2. CP1251            9. ISO-8859-1    16. ISO-8859-2   23. ISO-8859-9
  3. CP1255            10. ISO-8859-10  17. ISO-8859-3   24. KOI8-R
  4. CP1256            11. ISO-8859-11  18. ISO-8859-4   25. KOI8-U
  5. GEORGIAN-ACADEMY  12. ISO-8859-13  19. ISO-8859-5   26. TIS-620
  6. GEORGIAN-PS       13. ISO-8859-14  20. ISO-8859-6   27. UTF-8
  7. IBM1133           14. ISO-8859-15  21. ISO-8859-7   28. VISCII

Encoding to use on the console:

Я могу apt-mark hold что этот пакет является мерой ограничения, но это не решение. Как я могу установить тип кодировки по умолчанию?

2 ответа2

2

Погуглив некоторые из ошибок debconf, с которыми сталкивается мой скрипт, другие ответы на все вопросы, похоже, имеют одну общую черту - удаленное выполнение через SSH. Похоже, что это также метод Amazon для выполнения сценариев пользовательских данных при подготовке экземпляров.

Эти SSH-соединения, по-видимому, не имеют доступа к определенным переменным среды или данным конфигурации по умолчанию, поэтому их явная настройка помогает уменьшить количество ошибок. Установка неинтерактивной переменной среды DEBCONF_FRONTEND=noninteractive как предлагается здесь и по другим вопросам, не помогает в этом конкретном случае.

Мне удалось установить кодировку по умолчанию (из-за которой мой скрипт зависал) для пакета console-setup с помощью debconf-set-selections для обновления базы данных конфигурации перед первым вызовом apt-get . Он принимает файл в качестве аргумента, поэтому строку конфигурации можно записать во временный файл и впоследствии удалить:

echo "console-setup   console-setup/charmap47 select  UTF-8" > encoding.conf
debconf-set-selections encoding.conf
rm encoding.conf
apt-get update && apt-get upgrade -y

Кроме того, я смог подавить многие предупреждения debconf, добавив export TERM=xterm в начало скрипта.

1

Вы должны установить следующую переменную среды в верхней части вашего скрипта: export DEBCONF_FRONTEND=noninteractive ; обратитесь к руководству за дополнительными пояснениями (см. http://manpages.ubuntu.com/manpages/artful/man7/debconf.7.html). Также, чтобы быть уверенным, добавьте ключ -qq в apt-get .

Обратите внимание, что я использую export как он будет распространять переменную среды в текущую и дочернюю среды (в отличие от записи VAR=VALUE ). Это необходимо, потому что apt-get будет порождать другие процессы для настройки пакетов.

Это выдержка из страницы руководства Bash:

export [-fn] [name [= word]] ... export -p Предоставленные имена помечаются для автоматического экспорта в среду последующих выполненных команд. Если задана опция -f, имена относятся к функциям ...

Надеюсь это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .