Як уникнути інтерактивних діалогів під час запуску "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-get і з -yі -qпрапором.

Відповіді:


21

Ця послідовність команд працює для мене:

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

Так, DEBIAN_FRONTEND=noninteractiveце правильно, але вам також потрібен -qпрапор.

Джерело: https://github.com/moby/moby/isissue/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а не деконфікують, оскільки за цим інцидентом у підходящому списку ви не самотні.

Як вирішення, я знайшов цю відповідь на 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 це не повинно бути проблемою, але це варто зазначити.


Наразі моє вирішення працює стабільно. Але все-таки добре знати, що існує альтернативне рішення.
Філіп Класен

У мене була схожа проблема з 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

Сподіваюся, це допомагає


Ви повинні зв’язати дві команди firsts з &&, тому помилка в першому див. Не дозволить запустити apt-get, якщо файл ucf заблоковано іншим процесом
Tensibai

І примусове використання конфлікту на grub, ймовірно, залишить вашу систему незавантаженою, вам слід уникати цього для grub
Tensibai

@Tensibai Я завершив свою первинну відповідь, але для точного використання я використовував це для автоматизації нового розгортання VM. Звичайно, возитися з грубом є досить небезпечно, і я б не радив грати з цим під час маніпуляцій із важливими серверами, але, з іншого боку, не є apt upgradeв цьому випадку надзвичайно небезпечним? Якщо б у мене не був знімок чи інший ефективний спосіб відновити своє середовище за лічені хвилини, я б не намагався це зробити.
Бальміпур

1
оновлення apt-get само по собі не є небезпечним. Але коли ви застосовуєте збереження старих конфігурацій, це може бути. Більше того, не перевіряючи, чи встановлено потрібний стан у відповідність (у вашому коді помилка залишить примусові дії), які стануть проблемою (цей список, ймовірно, зупиниться на помилку влучного отримання, ніколи не коментуючи рядок ...)
Тенсібай

1
Це є явно конструктивним. І ви особливо праві вказуєте на ризик залишити коментовану лінію зліва (я вагався, використовуючи її, і розглядаю можливість додавання перевірки, щоб запобігти її). Що стосується мого використання, я впевнений, що ризики є незначними, але хтось може сліпо використовувати це, не знаючи наслідків. (навіть якщо ніколи не слід виконувати випадкові команди, не розуміючи, що вони роблять).
Бальміпур

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 оновлює лише список пакунків із віддаленого сховища, немає ніяких причин встановлювати -я там ...
Тенсібай

@Tensibai Так, це також не має ніякого значення. Та сама помилка.
Філіп Класен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.