Jak uniknąć interaktywnych okien dialogowych podczas uruchamiania „apt-get upgrade -y” w Ubuntu 16.04 podczas pakowania z Packerem?

27

Używam Packera do utworzenia AWS AMI na podstawie obrazu Ubuntu 16.04. Na początku robię aktualizację:

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

Oto odpowiednia część mojej sekcji dostawców:

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

Łamie to jednak automatyzację, ponieważ pojawia się interaktywne okno dialogowe:

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

Próbowałem też ustawić export DEBIAN_FRONTEND=noninteractivewcześniej (zgodnie z zaleceniami w tej odpowiedzi ). Niestety nie ma znaczenia.

Pytania:

  • Czy istnieje sposób na ominięcie iteracyjnego okna dialogowego (wybranie opcji 1 byłoby w porządku)?
  • Czy zamiast tego lepiej jest unikać aktualizacji i ufać, że interfejsy AMI są aktualne i zawierają krytyczne poprawki bezpieczeństwa?

Tło: To jest odpowiednia część mojej sekcji „konstruktorów”, w której skonfigurowałem ją tak, aby korzystała z najnowszej dostępnej technologii 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
    },
  ...
}]

Uwaga : Okazuje się, że noniteractivetryb działa, jeśli uruchomić apt-get update zarówno z -yjak i -qflagi.

Philipp Claßen
źródło

Odpowiedzi:

21

Ta sekwencja poleceń działa dla mnie:

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

Tak, DEBIAN_FRONTEND=noninteractivejest poprawne, ale potrzebujesz także -qflagi.

Źródło: https://github.com/moby/moby/issues/4032

Philipp Claßen
źródło
2
Możesz (prawdopodobnie?) Uprościć to apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Nie wydaje mi się, żeby apt-get update pojawiał się monit o cokolwiek, więc prawdopodobnie nie potrzebuje DEBIAN_FRONTEND, a więc tak naprawdę nie musisz export DEBIAN_FRONTENDi nie musisz go kontynuować przez resztę twojego środowiska. W jakimkolwiek stopniu, który ma dla Ciebie znaczenie.
Michael Mol
@MichaelMol Działa dobrze. Zaktualizowałem swoją odpowiedź.
Philipp Claßen
FWIW, może to spowodować, że apt-get po prostu pominie pakiet wymagający interakcji i nie zaktualizuje go (pozostawiając słowo w dzienniku na temat „pakiet X wymaga ręcznej aktualizacji”). Jeśli chodzi o załatanie pakietów, to nie jest to dobra droga.
Tensibai
11

Problem polega na tym, że zmiana pliku gruba jest zgodna z ucfdebconf, a nie z nim, ponieważ na tym incydencie na liście apt nie jesteś sam.

Jako obejście znalazłem tę odpowiedź na askunbuntu. W menu.lsttwoim przypadku powinno wystarczyć usunięcie systemu konfiguracji 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"
    ]
  }
]

To powinno uniknąć pytania grub. Ostrzegam, że każdy inny pakiet korzystający z ucf będzie również używał wersji pakietu opiekuna, dla stworzenia z podstawowego ami nie powinno to stanowić problemu, ale warto o tym pamiętać.

Tensibai
źródło
Obecnie moje obejście działa stabilnie. Jednak dobrze wiedzieć, że istnieje alternatywne rozwiązanie.
Philipp Claßen
Miałem podobny problem z grub na Ubuntu 18.04 i uważam, że ta ucfpoprawka powinna zostać uwzględniona w kompletnym rozwiązaniu wraz z poleceniami w odpowiedzi @ PhilippClaßen
RichVel
2

Aby dodać do odpowiedzi Filipa, jeśli używasz sudo, musisz upewnić się, że ustawiłeś DEBIAN_FRONTENDzmienną w następujący sposób:

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Christos Dimitroulas
źródło
Lub potrzebujesz sudo -E, ale nadal powoduje to wyłączenie zawieszenia i powoduje przejście do pakietu, nie uzyskując aktualizacji zgodnie z oczekiwaniami.
Tensibai
Jak możesz zagwarantować, że zaktualizujesz pakiet?
Christos Dimitroulas
Zobacz moją odpowiedź, niektóre pakiety muszą być traktowane inaczej niż okna dialogowe automatycznych odpowiedzi.
Tensibai
1

Nie zauważyłem żadnej różnicy przy użyciu opcji -y lub -q. Może dlatego, że pytanie dotyczy użycia „pakowacza”? (Używam nagich skryptów)

W każdym razie, w moim przypadku, pozbyłem się okien dialogowych do apt upgradeużywania następujących poleceń 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

Moja zmiana jest ograniczona do czasu aktualizacji.
Technicznie wyłącza to pytania dotyczące utrzymania lub nieistnienia istniejącej konfiguracji podczas aktualizacji gruba, ale tylko na czas aktualizacji, aby uniknąć skutków ubocznych.

System operacyjny: Ubuntu 16.04 LTS

Mam nadzieję że to pomoże

Balmipour
źródło
Powinieneś połączyć dwa pierwsze polecenia za pomocą &&, więc błąd przy pierwszym zobaczeniu nie pozwoli na uruchomienie apt-get, jeśli plik
ucf
A egzekwowanie opcji confold na grub może spowodować, że twój system nie uruchomi się, powinieneś tego unikać dla grub
Tensibai
@Tensibai przyciąłem swoją wstępną odpowiedź, ale użyłem jej do precyzyjnego wykorzystania tego do zautomatyzowania wdrażania nowej maszyny wirtualnej. Oczywiście, bałagan z grub jest dość niebezpieczny i nie radziłbym sobie z tym przy manipulowaniu ważnymi serwerami, ale z drugiej strony ... czy nie jest apt upgradesam w sobie wyjątkowo niebezpieczny? Chyba że mam migawkę lub inny skuteczny sposób na odbudowę środowiska w ciągu kilku minut, nie spróbowałbym tego.
Balmipour
1
Aktualizacja apt-get sama w sobie nie jest niebezpieczna. Ale kiedy wymuszasz zachowanie starych konfiguracji, może to być możliwe. Ponadto, nie sprawdzając, czy ustawiłeś pożądany stan OK na końcu (w kodzie awaria zakończy egzekwowanie), które stają się problemem (ta lista prawdopodobnie zatrzyma się w przypadku awarii apt-get, nigdy nie komentując linii ...)
Tensibai
1
Jest to wyraźnie konstruktywne. I w szczególności masz rację, zwracając uwagę na ryzyko pozostawienia niezakomentowanej linii po lewej stronie (wahałem się, czy jej użyć, i rozważę dodanie czeku, aby temu zapobiec). W moim przypadku użycia jestem pewien, że ryzyko jest znikome, ale ktoś mógłby to wykorzystać na ślepo, nie znając konsekwencji. (nawet jeśli nigdy nie należy uruchamiać losowych poleceń bez zrozumienia ich działania).
Balmipour
0

Pomijasz -yparametr w swoim apt-get updatepoleceniu. Jeśli go dodasz, monit powinien zniknąć.

Zbudowałem również obraz Ubuntu z Packerem. Oto skrypt powłoki, którego używam do przeprowadzenia aktualizacji:

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

Wywodzi się to ze świetnej, dobrze utrzymanej biblioteki kompilacji Ubuntu Packer:

https://github.com/boxcutter/ubuntu

Dave Swersky
źródło
2
apt-get update aktualizuje tylko listę pakietów ze zdalnego repozytorium, nie ma powodu, aby ustawić -y tam ...
Tensibai
@Tensibai Tak, to również nie ma znaczenia. Ten sam błąd.
Philipp Claßen