Comment éviter les dialogues interactifs lors de l'exécution de «apt-get upgrade -y» dans Ubuntu 16.04 lors de l'empaquetage avec Packer?

27

J'utilise Packer pour créer une AWS AMI basée sur une image Ubuntu 16.04. Au début, je fais une mise à niveau:

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

Voici la partie pertinente de ma section Provisioners:

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

Cependant, cela rompt l'automatisation lorsqu'une boîte de dialogue interactive apparaît:

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

J'ai également essayé de définir export DEBIAN_FRONTEND=noninteractiveavant (comme recommandé dans cette réponse ). Malheureusement, cela ne fait aucune différence.

Des questions:

  • Existe-t-il un moyen de dépasser la boîte de dialogue itérative (sélectionner l'option 1 serait bien)?
  • Est-il préférable d'éviter les mises à niveau et de croire plutôt que les AMI sont à jour et contiennent les correctifs de sécurité critiques?

Contexte: C'est la partie pertinente de ma section "constructeurs", où je l'ai configurée pour utiliser la dernière AMI disponible:

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

Remarque : Il s'avère que le noniteractivemode fonctionne si vous exécutez la mise à jour apt-get avec à la fois -yl' -qindicateur et.

Philipp Claßen
la source

Réponses:

21

Cette séquence de commandes fonctionne pour moi:

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

Donc, DEBIAN_FRONTEND=noninteractivec'est correct, mais vous avez également besoin du -qdrapeau.

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

Philipp Claßen
la source
2
Vous pouvez (probablement?) Simplifier cela apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Je ne pense pas que celaapt-get update demande quoi que ce soit, donc cela n'a probablement pas besoin DEBIAN_FRONTEND, et donc vous n'avez pas vraiment à le faire export DEBIAN_FRONTENDet à le faire continuer d'exister dans le reste de votre environnement. Dans la mesure où cela vous importe.
Michael Mol
@MichaelMol Fonctionne très bien. J'ai mis à jour ma réponse.
Philipp Claßen
FWIW, cela peut conduire à apt-get simplement sauter le package nécessitant une interaction et ne pas le mettre à niveau (en laissant un mot dans le journal à propos du 'package X nécessite une mise à niveau manuelle'). Si l'idée est d'obtenir des packages corrigés, ce n'est pas la voie à suivre.
Tensibai
11

Votre problème est que le changement de fichier grub respecte ucfet non debconf, selon cet incident sur la liste apt, vous n'êtes pas seul.

Pour contourner ce problème, j'ai trouvé cette réponse sur askunbuntu. La suppression du menu.lstsystème de configuration UCF devrait être suffisante, dans votre cas:

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

Cela devrait éviter la question grub. Soyez averti que tout autre paquet utilisant ucf utilisera également la version du paquet mainteneur, pour une création à partir d'un ami de base, cela ne devrait pas être un problème, mais cela vaut la peine d'être noté.

Tensibai
la source
Actuellement, ma solution de contournement est stable. Pourtant, bon de savoir qu'il existe une solution alternative.
Philipp Claßen
J'ai eu un problème similaire avec grub sur Ubuntu 18.04, et je pense que ce ucfcorrectif devrait être inclus dans une solution complète avec les commandes dans la réponse de @ PhilippClaßen
RichVel
2

Pour ajouter à la réponse de Philipp, si vous utilisez, sudovous devez vous assurer de définir la DEBIAN_FRONTENDvariable par la suite, comme suit:

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Christos Dimitroulas
la source
Ou vous avez besoin de sudo -E, mais cela ne fait que désactiver le «blocage» et provoquer simplement un saut dans le package, sans réaliser une mise à niveau comme prévu.
Tensibai
Comment pouvez-vous vous assurer que vous mettez à niveau le package?
Christos Dimitroulas
Voir ma réponse, certains packages doivent être traités différemment des dialogues de réponse automatique.
Tensibai
1

Je n'ai remarqué aucune différence en utilisant -y ou -q. Peut-être parce que la question concerne l'utilisation de "packer"? (J'utilise des scripts nus)

Quoi qu'il en soit, dans mon cas, je me suis débarrassé des boîtes de dialogue pour apt upgradeutiliser les commandes sed suivantes autour de lui:

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

Ma modification est limitée au moment de la mise à niveau.
Techniquement, il désactive les questions sur la conservation ou non d'une configuration existante lors de la mise à niveau de grub, mais uniquement pendant la durée de la mise à niveau, pour éviter les effets secondaires.

Système d'exploitation: Ubuntu 16.04 LTS

J'espère que cela t'aides

Balmipour
la source
Vous devez lier les deux premières commandes avec && afin qu'un échec dans la première vue ne permette pas à apt-get de s'exécuter si le fichier ucf est verrouillé par un autre processus
Tensibai
Et l'application de la confusion sur grub risque de laisser votre système non amorçable, vous devriez l'éviter pour grub
Tensibai
@Tensibai J'ai coupé ma réponse initiale, mais j'avais l'habitude de préciser que je l'utilisais pour automatiser le déploiement de nouvelles machines virtuelles. Bien sûr, jouer avec grub est assez dangereux, et je ne conseillerais pas de jouer avec cela lors de la manipulation de serveurs importants, mais d'un autre côté ... n'est-il pas apt upgradeseul extrêmement dangereux dans ce cas? À moins d'avoir un instantané ou un autre moyen efficace de reconstruire mon environnement en quelques minutes, je ne l'essayerais pas.
Balmipour
1
La mise à niveau d'apt-get n'est pas dangereuse en soi. Mais lorsque vous imposez de conserver les anciennes configurations, cela peut être le cas. De plus, ne pas vérifier que vous définissez l'état souhaité OK à la fin (dans votre code, un échec laissera l'application) qui devient un problème (cette liste s'arrêtera probablement sur un échec apt-get, sans jamais commenter la ligne ...)
Tensibai
1
Il est clairement constructif. Et vous avez particulièrement raison de souligner le risque de laisser la ligne non commentée (j'ai hésité à l'utiliser, et j'envisagerai d'ajouter une vérification pour l'empêcher). Pour mon cas d'utilisation, je suis sûr que les risques sont négligeables, mais quelqu'un pourrait l'utiliser aveuglément sans en connaître les conséquences. (même si l'on ne doit jamais exécuter des commandes aléatoires sans comprendre ce qu'elles font).
Balmipour
0

Vous omettez le -yparamètre de votre apt-get updatecommande. Si vous l'incluez, l'invite devrait disparaître.

J'ai également construit une image Ubuntu avec Packer. Voici le script shell que j'utilise pour effectuer la mise à jour:

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

Ceci est dérivé d'une grande bibliothèque bien entretenue de builds Ubuntu Packer:

https://github.com/boxcutter/ubuntu

Dave Swersky
la source
2
apt-get update ne met à jour que la liste des packages du référentiel distant, il n'y a aucune raison de définir un -y là ...
Tensibai
@Tensibai Oui, cela ne fait également aucune différence. Même erreur.
Philipp Claßen