Come evitare i dialoghi interattivi quando si esegue "apt-get upgrade -y" in Ubuntu 16.04 quando si impacchetta con Packer?


27

Sto usando Packer per creare un AMI AWS basato su un'immagine Ubuntu 16.04. All'inizio sto facendo un aggiornamento:

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

Ecco la parte pertinente della mia sezione Provider:

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

Ciò interrompe l'automazione, tuttavia, quando viene visualizzata una finestra di dialogo interattiva:

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

Ho anche provato a impostare export DEBIAN_FRONTEND=noninteractiveprima (come raccomandato in questa risposta ). Sfortunatamente, non fa differenza.

Domande:

  • C'è un modo per superare la finestra di dialogo iterattiva (selezionando l'opzione 1 andrebbe bene)?
  • È invece meglio evitare gli aggiornamenti e invece fidarsi che le AMI siano aggiornate e contengano le patch di sicurezza critiche?

Background: questa è la parte rilevante della mia sezione "costruttori", dove l'ho configurata per usare l'ultima AMI disponibile:

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

Nota : risulta che la noniteractivemodalità funziona se si esegue apt-get update sia con -yil -qflag sia con il flag.

Risposte:


21

Questa sequenza di comandi funziona per me:

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

Quindi, DEBIAN_FRONTEND=noninteractiveè corretto ma hai anche bisogno della -qbandiera.

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


2
Puoi (probabilmente?) Semplificarlo apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Non penso che apt-get update richieda nulla, quindi probabilmente non è necessario DEBIAN_FRONTEND, quindi non è necessario export DEBIAN_FRONTENDe continui a esistere nel resto del tuo ambiente. Nella misura in cui è importante per te.
Michael Mol,

@MichaelMol Funziona bene. Ho aggiornato la mia risposta.
Philipp Claßen,

FWIW, questo può portare ad apt-get semplicemente saltando il pacchetto che necessita di interazione e non aggiornandolo (lasciando una parola nel registro su 'pacchetto X necessita aggiornamento manuale'). Se l'idea è di ottenere pacchetti patchati, non è la strada da percorrere.
Tensibai,

11

Il tuo problema è che il cambio di file grub aderisce ucfe non debconf, secondo questo incidente nella lista apt non sei solo.

Come soluzione alternativa ho trovato questa risposta su askunbuntu. La rimozione menu.lstdal sistema di configurazione UCF dovrebbe essere sufficiente, nel tuo caso:

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

Questo dovrebbe evitare la domanda grub. Si noti che qualsiasi altro pacchetto che utilizza ucf utilizzerà anche la versione del pacchetto di manutenzione, per una creazione da un ami di base questo non dovrebbe essere un problema, ma vale la pena notare.


Attualmente, la mia soluzione alternativa è stabile. Tuttavia, è bello sapere che esiste una soluzione alternativa.
Philipp Claßen,

Ho avuto un problema simile con grub su Ubuntu 18.04 e credo che questa ucfcorrezione dovrebbe essere inclusa in una soluzione completa insieme ai comandi nella risposta di @ PhilippClaßen
RichVel

2

Per aggiungere alla risposta di Philipp, se si sta utilizzando, sudoè necessario assicurarsi di impostare successivamente la DEBIAN_FRONTENDvariabile, in questo modo:

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

Oppure hai bisogno di sudo -E, ma questo sta ancora disabilitando 'hang' e sta causando un salto al pacchetto, non ottenendo un aggiornamento come previsto.
Tensibai,

Come puoi assicurarti di aggiornare il pacchetto?
Christos Dimitroulas,

Vedi la mia risposta, alcuni pacchetti devono essere trattati in modo diverso per i dialoghi con risposta automatica.
Tensibai,

1

Non ho notato alcuna differenza usando -y o -q. Forse perché la domanda riguarda l'uso di "packer"? (Uso script nudi)

Ad ogni modo, nel mio caso, mi sono sbarazzato delle finestre di dialogo per l' apt upgradeutilizzo dei seguenti comandi 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

La mia modifica è limitata al momento dell'aggiornamento.
Tecnicamente, disabilita le domande sul mantenimento o meno di una configurazione esistente durante l'aggiornamento di grub, ma solo per il momento dell'aggiornamento, per evitare effetti collaterali.

Sistema operativo: Ubuntu 16.04 LTS

Spero che sia di aiuto


Dovresti collegare i due primi comandi con &&, quindi un errore nella prima visualizzazione non consentirà l'esecuzione di apt-get se il file ucf è bloccato da un altro processus
Tensibai

E far applicare la confold su grub lascerà probabilmente il tuo sistema non avviabile, dovresti evitarlo per grub
Tensibai,

@Tensibai Ho tagliato la mia risposta iniziale, ma ero abituato a precisare che stavo usando questo per automatizzare la distribuzione di nuove macchine virtuali. Certo, scherzare con grub è abbastanza pericoloso, e non consiglierei di giocarci su quando si manipolano server importanti, ma d'altra parte ... non è apt upgradesolo estremamente pericoloso in questo caso? Se non avessi un'istantanea o un altro modo efficace di ricostruire il mio ambiente in pochi minuti, non ci proverei.
Balmipour,

1
L'aggiornamento di apt-get non è di per sé pericoloso. Ma quando imponi il mantenimento di vecchie configurazioni, questo può essere. Inoltre, non controllando di impostare lo stato desiderato OK alla fine (nel tuo codice un errore lascerà l'applicazione) che diventa un problema (questo elenco probabilmente si fermerà su un errore apt-get, senza mai commentare la riga ...)
Tensibai,

1
Si è chiaramente costruttivo. E hai particolarmente ragione a sottolineare il rischio di lasciare la linea non commentata (ho esitato a usarla e prenderò in considerazione l'aggiunta di un controllo per impedirlo). Per il mio caso d'uso, sono sicuro che i rischi sono trascurabili, ma qualcuno potrebbe utilizzarlo ciecamente senza conoscerne le conseguenze. (anche se non si dovrebbero mai eseguire comandi casuali senza capire cosa fanno).
Balmipour,

0

Stai omettendo il -yparametro dal tuo apt-get updatecomando. Se lo includi, il prompt dovrebbe scomparire.

Ho anche creato un'immagine di Ubuntu con Packer. Ecco lo script della shell che utilizzo per eseguire l'aggiornamento:

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

Questo deriva da una grande libreria ben mantenuta di build di Ubuntu Packer:

https://github.com/boxcutter/ubuntu


2
apt-get update aggiorna solo l'elenco dei pacchetti dal repository remoto, non c'è motivo di impostare un -y lì ...
Tensibai,

@Tensibai Sì, non fa differenza. Stesso errore
Philipp Claßen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.