web-dev-qa-db-fra.com

Méthode non interactive pour dpkg-reconfigure tzdata

Lors de la première configuration d'un serveur Ubuntu, je m'assure que je aptitude install tzdata, puis dpkg-reconfigure tzdata pour régler correctement mon fuseau horaire.

J'essaie d'automatiser la configuration de mon serveur avec un script, et j'ai remarqué que ce morceau jette une clé dedans étant automatique, car il nécessite une session interactive avec l'intervention de l'utilisateur.

Existe-t-il un moyen d'utiliser dpkg-reconfigure sans qu'il soit interactif?

69
kenny

[~ # ~] mise à jour [~ # ~] : cette question est désormais hors sujet pour StackOverflow.
Veuillez voir la bonne réponse sur ServerFault .

84
swill

La réponse par swill n'est pas comment cela se fait correctement. Si vous voulez une configuration dpkg sans assistance/scriptée des packages, alors vous voulez utiliser le mécanisme de préconfiguration debconf.

Dans votre cas, cela signifie que vous devez procéder comme suit:

  • définissez les variables d'environnement suivantes pour éviter que debconf essaie de poser des questions à l'utilisateur:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • puis préconfigurez debconf avec le fichier preseed.txt suivant (ou tout autre paramètre que vous désirez):

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • vous définissez le fichier prédéfini ci-dessus en exécutant:

    debconf-set-selections /your/preseed.txt
    
  • vous pouvez maintenant soit installer tzdata (s'il n'est pas encore installé) via apt ou exécuter dpkg-reconfigure. Au final, tzdata sera configuré en fonction de ce que vous avez spécifié dans votre fichier de préconfiguration debconf.

N'oubliez pas que vous pouvez automatiser beaucoup plus en utilisant la préconfiguration debconf. Par exemple dans mes preseeds je mets toujours:

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

Vous pouvez toujours inspecter les paramètres debconf de votre système actuel en exécutant debconf-get-selections. La sortie devrait vous donner une idée de la quantité de configuration système que vous pouvez automatiser à l'aide de la préconfiguration debconf.

55
josch

Il y a un bug ( https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806 , non corrigé au moment d'écrire cette réponse) dans 16.04 qui provoque le contenu de /etc/timezone à remplacer par l'ancienne valeur lors de l'exécution de dpkg-reconfigure -f noninteractive tzdata. Le correctif est le suivant (à partir du rapport de bogue ci-dessus):

$ 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

Pas besoin de modifier manuellement le contenu de /etc/timezone. Cela a fonctionné pour moi sur Ubuntu 16.04.2 LTS.

24
tdenniston

Faire ceci dans un 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 echo "tzdata tzdata/Areas select Europe" > /tmp/preseed.txt; \
    echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.txt; \
    debconf-set-selections /tmp/preseed.txt && \
    rm /etc/timezone && \
    rm /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/*

Dans mes expériences, j'ai déterminé la suppression des fichiers dans /etc nécessaire.

18
Nils Ballmann

Avancer josch réponse; définissez les valeurs de la base de données debconf et supprimez /etc/{localtime,timezone} avant d'exécuter 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.

Cette méthode est connue pour fonctionner sur: -

  • Ubunty Trusty (14.04.5 LTS)
10
jah

Voici mon Dockerfile pour la dernière distribution Ubuntu 18.04 LTS, adaptée de la réponse de @NilsBallmann. J'ai également supprimé la création de fichiers temporaires et compacté l'installation du package en une seule couche:

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/*
6
sergei_ivanov