Как избежать интерактивных диалогов при запуске «apt-get upgrade -y» в Ubuntu 16.04 при упаковке с помощью Packer?

27

Я использую Packer для создания AWS AMI на основе образа Ubuntu 16.04. В начале я делаю обновление:

sudo apt-get update
sudo apt-get upgrade -y

Вот соответствующая часть моего раздела провайдеров:

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo apt-get update",
      "sudo apt-get upgrade -y"
    ]
  }
]

Однако это нарушает автоматизацию, когда появляется интерактивное диалоговое окно:

amazon-ebs: Found kernel: /boot/vmlinuz-4.4.0-72-generic
amazon-ebs: A new version of /boot/grub/menu.lst is available, but the version installed
amazon-ebs: currently has been locally modified.
amazon-ebs:
amazon-ebs: 1. install the package maintainer's version
amazon-ebs: 2. keep the local version currently installed
amazon-ebs: 3. show the differences between the versions
amazon-ebs: 4. show a side-by-side difference between the versions
amazon-ebs: 5. show a 3-way difference between available versions
amazon-ebs: 6. do a 3-way merge between available versions (experimental)
amazon-ebs: 7. start a new shell to examine the situation

Я также пытался установить export DEBIAN_FRONTEND=noninteractiveраньше (как рекомендуется в этом ответе ). К сожалению, это не имеет значения.

Вопросов:

  • Есть ли способ обойти итеративное диалоговое окно (выбор варианта 1 будет в порядке)?
  • Вместо этого лучше избегать обновлений и вместо этого полагать, что AMI обновлены и содержат критические исправления безопасности?

Предыстория: это соответствующая часть моего раздела "строителей", где я настроил его для использования последней доступной AMI:

"builders": [{
  "type": "amazon-ebs",
  "region": "eu-central-1",
    ...
    "source_ami_filter": {
        "filters": {
            "virtualization-type": "hvm",
            "name": "*ubuntu-xenial-16.04-amd64-server-*",
            "root-device-type": "ebs"
        },
        "owners": ["099720109477"],
        "most_recent": true
    },
  ...
}]

Примечание : Оказывается, что noniteractiveрежим работы при запуске APT-получить обновление с обеими -yи с -qфлагом.

Филипп Классен
источник

Ответы:

21

Эта последовательность команд работает для меня:

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq

Итак, DEBIAN_FRONTEND=noninteractiveэто правильно, но вам также нужен -qфлаг.

Источник: https://github.com/moby/moby/issues/4032

Филипп Классен
источник
2
Вы можете (возможно?) Упростить это до apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Я не думаю, что что-то apt-get update подсказывает, поэтому, вероятно, в этом нет необходимости DEBIAN_FRONTEND, и, таким образом, вам на самом деле не нужно, чтобы export DEBIAN_FRONTENDэто продолжало существовать в остальной среде. В какой степени это важно для вас.
Майкл Мол
@MichaelMol отлично работает. Я обновил свой ответ.
Филипп Классен
FWIW, это может привести к тому, что apt-get просто пропустит пакет, требующий взаимодействия, а не обновляя его (оставив в журнале слово о том, что «пакет X требует обновления вручную»). Если идея состоит в том, чтобы получить исправленные пакеты, то это не путь.
Тенсибай
11

Ваша проблема заключается в том, что изменения файла grub придерживаются, ucfа не debconf, в соответствии с этим инцидентом в списке apt вы не одиноки.

В качестве обходного пути я нашел этот ответ на askunbuntu. Удаление menu.lstиз конфигурации системы UCF должно быть достаточно для вашего случая:

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo ucf --purge /boot/grub/menu.lst"
      "sudo apt-get update",
      "sudo UCF_FORCE_CONFFNEW=YES apt-get upgrade -y"
    ]
  }
]

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

Tensibai
источник
В настоящее время мой обходной путь работает стабильно. Тем не менее, приятно знать, что есть альтернативное решение.
Филипп Классен
У меня была похожая проблема с grub в Ubuntu 18.04, и я считаю, что это ucfисправление должно быть включено в полное решение вместе с командами в ответе @ PhilippClaßen
RichVel
2

Чтобы добавить к ответу Филиппа, если вы используете его, sudoвам нужно обязательно установить DEBIAN_FRONTENDпеременную, например, так:

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Христос Димитрулас
источник
Или вам нужен sudo -E, но это по-прежнему просто отключает «зависание» и просто вызывает переход к пакету, а не обновление, как ожидалось.
Тенсибай
Как вы можете гарантировать, что вы обновите пакет?
Христос Димитрулас
Посмотрите мой ответ, некоторые пакеты нужно обрабатывать по-разному в диалогах автоответа.
Тенсибай
1

Я не заметил никакой разницы, используя -y или -q. Может быть, потому что вопрос об использовании "упаковщик"? (Я использую голые скрипты)

В любом случае, в моем случае я избавился от диалогов для apt upgradeиспользования следующих команд sed:

sed -i "s/#\ conf_force_conffold=YES/conf_force_conffold=YES/g" /etc/ucf.conf
apt-get -y upgrade
sed -i "s/conf_force_conffold=YES/#conf_force_conffold=YES/g" /etc/ucf.conf

Мое изменение ограничено временем обновления.
Технически, он отключает вопросы о сохранении или отсутствии существующей конфигурации при обновлении grub, но только на время обновления, чтобы избежать побочных эффектов.

ОС: Ubuntu 16.04 LTS

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

Balmipour
источник
Вы должны связать две первые команды с &&, чтобы ошибка при первом просмотре не позволила запустить apt-get, если файл ucf заблокирован другим
процессом
А принудительное использование confold на grub может привести к тому, что ваша система не будет загружаться, вы должны избегать ее для grub
Tensibai
@Tensibai Я урезал свой первоначальный ответ, но использовал для уточнения, я использовал это для автоматизации развертывания новой виртуальной машины. Конечно, возиться с grub довольно опасно, и я бы не советовал играть с этим при манипулировании важными серверами, но с другой стороны ... разве apt upgradeв таком случае не слишком опасно? Если у меня не будет снимка или другого эффективного способа восстановления моей среды за считанные минуты, я бы не стал его пробовать.
Balmipour
1
Обновление apt-get само по себе не опасно. Но когда вы сохраняете старые настройки, это может быть так. Более того, не проверяя, что вы устанавливаете желаемое состояние OK в конце (в вашем коде сбой приведет к принудительному исполнению), что становится проблемой (этот список, скорее всего, остановится на ошибке apt-get, никогда не комментируя строку ...)
Тенсибай
1
Это является явно конструктивным. И вы особенно правы, когда указываете на то, что оставьте незакомментированную строку слева (я не решался ее использовать и рассмотрю вопрос о добавлении некоторой проверки, чтобы предотвратить это). В моем случае использования я уверен, что риски незначительны, но кто-то может использовать это вслепую, не зная последствий. (даже если никогда не следует запускать случайные команды, не понимая, что они делают).
Balmipour
0

Вы опускаете -yпараметр в своей apt-get updateкоманде. Если вы включите его, подсказка должна исчезнуть.

Я также создал образ Ubuntu с помощью Packer. Вот сценарий оболочки, который я использую для обновления:

https://github.com/devopskatas/learningvm/blob/master/script/update.sh

Это происходит от отличной, хорошо поддерживаемой библиотеки сборок Ubuntu Packer:

https://github.com/boxcutter/ubuntu

Дейв Сверски
источник
2
apt-get update обновляет только список пакетов из удаленного репозитория, нет причин устанавливать -y там ...
Tensibai
@ Тенсибай Да, это тоже не имеет значения. Та же ошибка.
Филипп Классен