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?

kenny
quelle

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.

josch
quelle
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.

tdenniston
quelle
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.

Nils Ballmann
quelle
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)
jah
quelle
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/*
sergei_ivanov
quelle
3

In Ubuntu 18.04 mit systemd verwende ich:

  $ sudo timedatectl set-timezone 'Europe/Madrid'
  $ sudo dpkg-reconfigure --frontend noninteractive tzdata
ggrandes
quelle
Wohin führt das?
Mark Priddy
Es sieht so aus, als ob der zweite Befehl nicht erforderlich ist.
Andriy