Nicht interaktive Methode zur dpkg-Neukonfiguration von tzdata [geschlossen]


76

Wenn ich zum ersten Mal einen Ubuntu-Server einrichte , stelle ich sicher aptitude install tzdata, dpkg-reconfigure tzdatadass ich meine Zeitzone richtig einstelle.

Ich versuche, mein Server-Setup mit einem Skript zu automatisieren, und habe festgestellt, dass dieses Teil automatisch einen Schraubenschlüssel hineinwirft, da es eine interaktive Sitzung mit Benutzereingriffen erfordert.

Gibt es eine Möglichkeit, dpkg-refreshfigure zu verwenden, ohne dass es interaktiv ist?

Antworten:


66

Die Antwort von swill ist nicht, wie es richtig gemacht wird. Wenn Sie eine unbeaufsichtigte / skriptbasierte dpkg-Konfiguration von Paketen wünschen, möchten Sie den Debconf-Voreinstellungsmechanismus verwenden.

In Ihrem Fall bedeutet dies, dass Sie Folgendes tun müssen:

  • Legen Sie die folgenden Umgebungsvariablen fest, um zu vermeiden, dass debconf versucht, dem Benutzer Fragen zu stellen:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • dann preseed debconf mit der folgenden preseed.txt-Datei (oder anderen gewünschten Einstellungen):

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • Sie legen die obige Voreinstellungsdatei fest, indem Sie Folgendes ausführen:

    debconf-set-selections /your/preseed.txt
    
  • Sie können jetzt entweder tzdata (falls noch nicht installiert) über installieren aptoder ausführen dpkg-reconfigure. Am Ende werden tzdata gemäß den Angaben in Ihrer debconf-Voreinstellungsdatei eingerichtet.

Denken Sie daran, dass Sie mit debconf preseeding viel mehr automatisieren können. Zum Beispiel habe ich in meinen Voreinstellungen immer Folgendes festgelegt:

locales locales/locales_to_be_generated multiselect     en_US.UTF-8 UTF-8
locales locales/default_environment_locale      select  en_US.UTF-8

Sie können jederzeit die Debconf-Einstellungen Ihres aktuellen Systems überprüfen, indem Sie ausführen debconf-get-selections. Die Ausgabe sollte Ihnen eine Vorstellung davon geben, wie viel von der Systemkonfiguration Sie mithilfe der Debconf-Voreinstellung automatisieren können.


4
Am Ende musste ich anrufen dpkg-reconfiguremit -f noninteractivesowieso ... (Ubuntu 12.04 LTS hier). Ansonsten haben Ihre Anweisungen super funktioniert!
kgadek

4
Funktioniert hervorragend vor der Installation, aber ich glaube nicht, dass dies tatsächlich funktioniert, wenn das Paket bereits installiert ist. AFAIK Sie müssen zuerst das Paket entfernen.
Spinkus

3
@ S.Pinkus du hast recht; Es muss entfernt werden, /etc/{localtime,timezone}wenn tzdata bereits installiert ist. Siehe stackoverflow.com/a/39275359/161114 .
Jah

Dies aus der Ferne durch ssh tun:$ ssh node 'export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true;echo -e "tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Amsterdam" > /tmp/tz ; sudo debconf-set-selections /tmp/tz; sudo rm /etc/localtime /etc/timezone; sudo dpkg-reconfigure -f non-interactive tzdata'
hbogert

2
@hbogert Ihre Verwendung von /tmp/tzist ein Sicherheitsproblem. Zu dem Zeitpunkt, an dem Sie von /tmp/tzanderen gelesen haben, könnte ein anderer Wert darauf geschrieben sein oder die Datei war bereits vorhanden (was Sie nicht überprüft haben) und Sie überschreiben sie. Verwenden Sie mktempdiese Option , um all diese Probleme zu vermeiden. Außerdem vergessen Sie, Ihre temporäre Datei am Ende zu entfernen. Schließlich ist Ihre Verwendung von -eals Argument für echonicht portierbar und Sie sollten printfstattdessen für die Zeilenumbrüche verwenden.
Josch

33

In 16.04 gibt es einen Fehler ( https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806 , der zum Zeitpunkt des Schreibens dieser Antwort nicht behoben wurde), der dazu führt, dass der Inhalt von /etc/timezonemit dem alten überschrieben wird Wert beim Ausführen dpkg-reconfigure -f noninteractive tzdata. Das Update lautet wie folgt (aus dem obigen Fehlerbericht):

$ sudo ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
Current default time zone: 'America/New_York'
Local time is now:      Mon Feb 20 07:30:33 EST 2017.
Universal Time is now:  Mon Feb 20 12:30:33 UTC 2017.
$ cat /etc/timezone
America/New_York

Der Inhalt von muss nicht manuell geändert werden /etc/timezone. Dies funktionierte für mich unter Ubuntu 16.04.2 LTS.


Am einfachsten, am saubersten, am besten. (Arbeiten in Ubuntu 16.04.4)
David Tabernero M.

Das ist kein Fehler. Das beabsichtigte Verhalten ( ln -fs...) wird vielmehr in Kommentar 9 zu diesem Ticket beschrieben . Außerdem ist diese Frage für SO jetzt nicht mehr zum Thema. Bitte ermutigen Sie OT-Fragen nicht, indem Sie sie beantworten :)
Dan Dascalescu

21

Tun Sie dies in einem Dockerfile:

FROM ubuntu:xenial

## for apt to be noninteractive
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true

## preesed tzdata, update package index, upgrade packages and install needed software
RUN truncate -s0 /tmp/preseed.cfg; \
    echo "tzdata tzdata/Areas select Europe" >> /tmp/preseed.cfg; \
    echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.cfg; \
    debconf-set-selections /tmp/preseed.cfg && \
    rm -f /etc/timezone /etc/localtime && \
    apt-get update && \
    apt-get install -y tzdata

## cleanup of files from setup
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

In meinen Experimenten habe ich festgestellt, dass die Dateien /etcunbedingt entfernt werden müssen.


Hinweis: Dies ist gefährlich, ENV DEBIAN_FRONTEND...da durch die Verwendung ENVdie Variable in der Umgebung erhalten bleibt, wenn der Container ebenfalls ausgeführt wird ( eine Warnung hierzu finden Sie unter docs.docker.com/engine/reference/builder/#env ). Wenn Sie sich umschauen, sehen Sie, dass ARGdies in dieser Situation bevorzugt werden sollte (z. B. ARG DEBIAN_FRONTEND...), da der Wert der Variablen nur während der Erstellung des Containers wirksam ist.
Anon

Während ich für Passwörter , API-Schlüssel und ähnliches bei Ihnen bin , hängt es in dieser speziellen Situation immer noch davon ab, ob Sie diese Konfigurationswerte in das Container-Image einbetten möchten oder nicht. Verwirrung für Benutzer kann ein Problem sein ...
Nils Ballmann

11

Advancing Josch ‚s Antwort; Setzen Sie die Debconf-Datenbankwerte und entfernen Sie sie,/etc/{localtime,timezone} bevor Sie Folgendes ausführen dpkg-reconfigure: -

$ echo "tzdata tzdata/Areas select Europe" > some/file.txt
$ echo "tzdata tzdata/Zones/Europe select Berlin" >> some/file.txt
$ sudo debconf-set-selections some/file.txt
$ sudo rm /etc/timezone
$ sudo rm /etc/localtime
$ sudo dpkg-reconfigure -f noninteractive tzdata
Current default time zone: 'Europe/Berlin'
Local time is now:      Thu Sep  1 17:13:16 CEST 2016.
Universal Time is now:  Thu Sep  1 15:13:16 UTC 2016.

Es ist bekannt, dass diese Methode funktioniert bei:

  • Ubunty Trusty (14.04.5 LTS)

1
Sie benötigen die temporäre Datei nicht. Justprintf 'tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Berlin\n' | sudo dpkg-set-selections
Tripleee

Und ich denke nicht, dass Sie die Dateien, in /etcdenen dpkg-reconfiguresowieso neu geschrieben werden soll , explizit entfernen müssen.
Tripleee

Danke Mann, du hast mich gerettet! Es funktioniert auch mit Docker Container: Debian: Stretch oder Ubuntu.
Vagner do Carmo

11

Hier ist meine Dockerfilefür die neueste Ubuntu 18.04 LTS-Distribution, angepasst aus der Antwort von @NilsBallmann. Ich habe auch die temporäre Dateierstellung entfernt und die Paketinstallation in eine einzige Ebene komprimiert:

FROM ubuntu:bionic

RUN export DEBIAN_FRONTEND=noninteractive; \
    export DEBCONF_NONINTERACTIVE_SEEN=true; \
    echo 'tzdata tzdata/Areas select Etc' | debconf-set-selections; \
    echo 'tzdata tzdata/Zones/Etc select UTC' | debconf-set-selections; \
    apt-get update -qqy \
 && apt-get install -qqy --no-install-recommends \
        tzdata \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

3

In Ubuntu 18.04 mit systemd verwende ich:

  $ sudo timedatectl set-timezone 'Europe/Madrid'
  $ sudo dpkg-reconfigure --frontend noninteractive tzdata

Wohin führt das?
Mark Priddy

Es sieht so aus, als ob der zweite Befehl nicht erforderlich ist.
Andriy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.