Wie vermeide ich interaktive Dialoge beim Ausführen von "apt-get upgrade -y" in Ubuntu 16.04 beim Packen mit Packer?

27

Ich verwende Packer , um ein AWS AMI basierend auf einem Ubuntu 16.04-Image zu erstellen. Am Anfang mache ich ein Upgrade:

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

Hier ist der relevante Teil meines Provisioner-Abschnitts:

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

Dies unterbricht jedoch die Automatisierung, da ein interaktives Dialogfeld angezeigt wird:

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

Ich habe auch versucht, export DEBIAN_FRONTEND=noninteractivevorher einzustellen (wie in dieser Antwort empfohlen ). Leider macht es keinen Unterschied.

Fragen:

  • Gibt es eine Möglichkeit, den iterativen Dialog zu umgehen (Auswahl von Option 1 wäre in Ordnung)?
  • Ist es stattdessen besser, Upgrades zu vermeiden und stattdessen darauf zu vertrauen, dass die AMIs auf dem neuesten Stand sind und die kritischen Sicherheitspatches enthalten?

Hintergrund: Dies ist der relevante Teil meines Abschnitts "Builder", in dem ich ihn für die Verwendung des neuesten verfügbaren AMI konfiguriert habe:

"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
    },
  ...
}]

Hinweis : Es stellt sich heraus, dass der noniteractiveModus funktioniert, wenn Sie apt-get update sowohl mit dem -yals auch mit dem -qFlag ausführen .

Philipp Claßen
quelle

Antworten:

21

Diese Befehlsfolge funktioniert für mich:

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

Ist DEBIAN_FRONTEND=noninteractivealso richtig, aber du brauchst auch die -qFlagge.

Quelle: https://github.com/moby/moby/issues/4032

Philipp Claßen
quelle
2
Sie können (wahrscheinlich?) Das vereinfachen apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Ich denke apt-get update , es werden keine Eingabeaufforderungen angezeigt, daher ist dies wahrscheinlich nicht erforderlich DEBIAN_FRONTEND, und Sie müssen export DEBIAN_FRONTENDund müssen es daher auch nicht für den Rest Ihrer Umgebung beibehalten. In welchem ​​Maße auch immer Ihnen das wichtig ist.
Michael Mol
@ MichaelMol Funktioniert gut. Ich habe meine Antwort aktualisiert.
Philipp Claßen
Wie bereits erwähnt, kann dies dazu führen, dass apt-get das Paket, für das eine Interaktion erforderlich ist, einfach überspringt und nicht aktualisiert (und im Protokoll ein Wort zu "Paket X muss manuell aktualisiert werden" hinterlässt). Wenn die Idee ist, gepatchte Pakete zu erhalten, ist dies nicht der richtige Weg.
Tensibai
11

Ihr Problem ist, dass die Änderungen an der Grub-Datei beibehalten werden ucfund nicht debconf, da Sie gemäß diesem Vorfall auf der Apt-Liste nicht alleine sind.

Als Workaround habe ich diese Antwort auf askunbuntu gefunden. Das Entfernen von menu.lstaus dem UCF-Konfigurationssystem sollte für Ihren Fall ausreichen:

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

Dies sollte die Grub-Frage vermeiden. Seien Sie gewarnt, dass jedes andere Paket, das ucf verwendet, auch die Betreuer-Paketversion verwendet. Für eine Erstellung aus einer Basis-Ami sollte dies kein Problem sein, aber es lohnt sich, darauf hingewiesen zu werden.

Tensibai
quelle
Derzeit läuft meine Problemumgehung stabil. Gut zu wissen, dass es eine alternative Lösung gibt.
Philipp Claßen
Ich hatte ein ähnliches Problem mit Grub unter Ubuntu 18.04, und ich glaube, dieses ucfUpdate sollte zusammen mit den Befehlen in der Antwort von @ PhilippClaßen
RichVel
2

Um Philipps Antwort zu ergänzen, müssen Sie bei Verwendung von sudoanschließend die DEBIAN_FRONTENDVariable wie folgt festlegen :

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Christos Dimitroulas
quelle
Oder Sie benötigen sudo -E, aber dies deaktiviert nur den "Hang" und veranlasst nur ein Überspringen des Pakets, ohne wie erwartet ein Upgrade durchzuführen.
Tensibai
Wie können Sie sicherstellen, dass Sie das Paket aktualisieren?
Christos Dimitroulas
Sehen Sie meine Antwort, einige Pakete müssen anders behandelt werden, um Dialoge automatisch zu beantworten.
Tensibai
1

Ich habe keinen Unterschied festgestellt, wenn ich -y oder -q verwende. Vielleicht, weil es um die Verwendung von "Packer" geht? (Ich benutze bloße Skripte)

Jedenfalls habe ich in meinem Fall die Dialoge für die apt upgradeVerwendung der folgenden sed-Befehle entfernt:

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

Meine Änderung ist auf den Zeitpunkt des Upgrades beschränkt.
Technisch gesehen werden die Fragen zum Beibehalten oder Nichtbeibehalten einer vorhandenen Konfiguration beim Upgrade von grub deaktiviert, jedoch nur für die Zeit des Upgrades, um Nebenwirkungen zu vermeiden.

Betriebssystem: Ubuntu 16.04 LTS

Hoffe das hilft

Balmipour
quelle
Sie sollten die beiden firsts-Befehle mit && verknüpfen, damit apt-get bei einem Fehler in der ersten Ansicht nicht ausgeführt werden kann, wenn die UFC-Datei von einem anderen
Prozess
Und das Durchsetzen von Confold auf Grub lässt Ihr System wahrscheinlich nicht mehr booten. Sie sollten es für Grub vermeiden
Tensibai,
@Tensibai Ich habe meine erste Antwort gekürzt, habe dies jedoch verwendet, um die Bereitstellung neuer VMs zu automatisieren. Natürlich ist es ziemlich gefährlich, sich mit Grub zu beschäftigen, und ich würde nicht raten, damit zu spielen, wenn man wichtige Server manipuliert, aber andererseits ... ist apt upgradein einem solchen Fall nicht allein extrem gefährlich? Ohne einen Schnappschuss oder eine andere effiziente Methode, um meine Umgebung in wenigen Minuten wiederherzustellen, würde ich es nicht versuchen.
Balmipour
1
apt-get upgrade ist an sich nicht gefährlich. Wenn Sie jedoch die Beibehaltung alter Konfigurationen erzwingen, kann dies der Fall sein. Wenn Sie nicht überprüfen, ob Sie den gewünschten Status am Ende auf OK gesetzt haben (in Ihrem Code wird ein Fehler die Durchsetzung verlassen), der zu einem Problem wird (diese Liste wird wahrscheinlich bei einem Fehler von apt-get enden und die Zeile niemals zurückkommentieren ...)
Tensibai
1
Es ist eindeutig konstruktiv. Und Sie haben besonders Recht, auf das Risiko hinzuweisen, dass die unkommentierte Zeile übrig bleibt (ich habe gezögert, sie zu verwenden, und erwäge, eine Überprüfung hinzuzufügen, um dies zu verhindern). Ich bin sicher, dass die Risiken für meinen Anwendungsfall vernachlässigbar sind, aber jemand könnte dies blind anwenden, ohne die Konsequenzen zu kennen. (Auch wenn man niemals zufällige Befehle ausführen sollte, ohne zu verstehen, was sie tun).
Balmipour,
0

Sie lassen den -yParameter in Ihrem apt-get updateBefehl weg. Wenn Sie es einfügen, sollte die Eingabeaufforderung verschwinden.

Ich habe auch ein Ubuntu-Image mit Packer erstellt. Hier ist das Shell-Skript, mit dem ich das Update durchführe:

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

Dies ist aus einer großartigen, gut gepflegten Bibliothek von Ubuntu Packer-Builds abgeleitet:

https://github.com/boxcutter/ubuntu

Dave Swersky
quelle
2
apt-get update aktualisiert nur die Liste der Pakete aus dem Remote-Repository, es gibt keinen Grund, dort ein -y zu setzen ...
Tensibai
@ Tensibai Ja, es macht auch keinen Unterschied. Gleicher Fehler.
Philipp Claßen