¿Cómo evitar diálogos interactivos cuando se ejecuta "apt-get upgrade -y" en Ubuntu 16.04 cuando se empaqueta con Packer?

27

Estoy usando Packer para crear una AMI de AWS basada en una imagen de Ubuntu 16.04. Al principio, estoy haciendo una actualización:

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

Aquí está la parte relevante de mi sección de aprovisionadores:

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

Sin embargo, esto interrumpe la automatización cuando aparece un cuadro de diálogo interactivo:

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

También intenté configurar export DEBIAN_FRONTEND=noninteractiveantes (como se recomienda en esta respuesta ). Lamentablemente, no hay diferencia.

Preguntas:

  • ¿Hay alguna manera de superar el diálogo iterativo (seleccionar la opción 1 estaría bien)?
  • ¿Es mejor evitar las actualizaciones y confiar en que las AMI están actualizadas y contienen los parches de seguridad críticos?

Antecedentes: esta es la parte relevante de mi sección de "constructores", donde la configuré para usar la última 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
    },
  ...
}]

Nota : Resulta que el noniteractivemodo funciona si ejecuta apt-get update con ambos -yy el -qindicador.

Philipp Claßen
fuente

Respuestas:

21

Esta secuencia de comandos funciona para mí:

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

Entonces, DEBIAN_FRONTEND=noninteractivees correcto pero también necesitas la -qbandera.

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

Philipp Claßen
fuente
2
Puedes (¿probablemente?) Simplificar eso a apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. No creo que apt-get update pida nada, por lo que probablemente no sea necesario DEBIAN_FRONTENDy, por lo tanto, realmente no tiene que hacerlo export DEBIAN_FRONTENDy continuar existiendo en el resto de su entorno. En cualquier grado que te importe.
Michael Mol
@MichaelMol funciona bien. He actualizado mi respuesta.
Philipp Claßen
FWIW, esto puede llevar a apt-get a omitir el paquete que necesita interacción y no actualizarlo (dejando una palabra en el registro sobre 'paquete X necesita actualización manual'). Si la idea es obtener paquetes parcheados, entonces no es el camino a seguir.
Tensibai
11

Su problema es que el cambio de archivo grub se adhiere ucfy no debconf, según este incidente en la lista de apt no está solo.

Como solución, encontré esta respuesta en askunbuntu. Eliminar el menu.lstsistema de configuración de UCF debería ser suficiente, para su 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"
    ]
  }
]

Esto debería evitar la cuestión de la comida. Tenga en cuenta que cualquier otro paquete que use ucf también usará la versión del paquete mantenedor, para una creación desde una base ami esto no debería ser un problema, pero vale la pena señalarlo.

Tensibai
fuente
Actualmente, mi solución corre estable. Aún así, es bueno saber que hay una solución alternativa.
Philipp Claßen
He tenido un problema similar con grub en Ubuntu 18.04, y creo que esta ucfsolución debería incluirse en una solución completa junto con los comandos en la respuesta de @ PhilippClaßen
RichVel
2

Para agregar a la respuesta de Philipp, si está utilizando sudo, debe asegurarse de configurar la DEBIAN_FRONTENDvariable después, de esta manera:

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Christos Dimitroulas
fuente
O necesita sudo -E, pero esto sigue deshabilitando el 'bloqueo' y provocando un salto al paquete, sin lograr una actualización como se esperaba.
Tensibai
¿Cómo puede asegurarse de actualizar el paquete?
Christos Dimitroulas
Vea mi respuesta, algunos paquetes deben tratarse de manera diferente a los diálogos de respuesta automática.
Tensibai
1

No noté ninguna diferencia usando -y o -q. Tal vez porque la pregunta es sobre el uso de "empacador"? (Yo uso scripts desnudos)

De todos modos, en mi caso, me deshice de los cuadros de diálogo para apt upgradeusar los siguientes comandos sed a su alrededor:

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

Mi cambio se limita al momento de la actualización.
Técnicamente, deshabilita las preguntas sobre mantener o no una configuración existente al actualizar grub, pero solo durante el tiempo de la actualización, para evitar efectos secundarios.

SO: Ubuntu 16.04 LTS

Espero que esto ayude

Balmipour
fuente
Se podrán enlazar los dos comandos PRIMEROS con && por lo que un fallo en la primera sede no permitirá que apt-get para funcionar si el archivo UCF está bloqueado por otro processus
Tensibai
Y la aplicación de confold en grub probablemente dejará su sistema no arrancable, debe evitarlo para grub
Tensibai
@Tensibai Recorté mi respuesta inicial, pero solía precisar que estaba usando esto para automatizar la nueva implementación de VM. Por supuesto, jugar con grub es bastante peligroso, y no recomendaría jugar con esto al manipular servidores importantes, pero por otro lado ... ¿no es apt upgradeextremadamente peligroso en ese caso? A menos que tenga una instantánea u otra forma eficiente de reconstruir mi entorno en cuestión de minutos, no lo intentaría.
Balmipour
1
La actualización de apt-get no es peligrosa per se. Pero cuando impones mantener configuraciones antiguas esto puede ser. Por otra parte, no se establece la comprobación permiso estado deseado al final (en el código de un fracaso dejará a la entrada en vigencia) que se convierten en un problema (esta lista es probable que parar en un fracaso apt-get, que nunca volver al comentar la línea ...)
Tensibai
1
Que es claramente constructiva. Y está especialmente en lo cierto al señalar el riesgo de que quede la línea no comentada (dudé en usarla y consideraré agregar alguna verificación para evitarla). Para mi caso de uso, estoy seguro de que los riesgos son insignificantes, pero alguien podría usar esto ciegamente sin saber las consecuencias. (incluso si uno nunca debe ejecutar comandos aleatorios sin comprender lo que hacen).
Balmipour
0

Estás omitiendo el -yparámetro de tu apt-get updatecomando. Si lo incluye, el aviso debería desaparecer.

También construí una imagen de Ubuntu con Packer. Aquí está el script de shell que uso para realizar la actualización:

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

Esto se deriva de una gran biblioteca bien mantenida de compilaciones de Ubuntu Packer:

https://github.com/boxcutter/ubuntu

Dave Swersky
fuente
2
apt-get update solo actualiza la lista de paquetes desde el repositorio remoto, no hay razón para configurar un -y allí ...
Tensibai
@Tensibai Sí, tampoco hace ninguna diferencia. Mismo error.
Philipp Claßen