Неінтерактивний метод для dpkg-переналаштування tzdata [закрито]


79

Коли я вперше налаштовую сервер Ubuntu, я переконуюсь aptitude install tzdata, що тоді dpkg-reconfigure tzdataя правильно встановив свій часовий пояс.

Я намагаюся автоматизувати налаштування мого сервера за допомогою сценарію, і помітив, що цей шматок накидає на нього ключ, який є автоматичним, оскільки вимагає інтерактивного сеансу із втручанням користувача.

Чи є спосіб використовувати dpkg-reconfigure, не будучи інтерактивним?

Відповіді:


66

Відповідь swill полягає не в тому, як це правильно робиться. Якщо вам потрібна конфігурація пакетів без нагляду / сценарію dpkg, тоді ви хочете скористатися механізмом попереднього засівання debconf.

У вашому випадку це означає, що вам потрібно зробити наступне:

  • встановіть такі змінні середовища, щоб уникнути того, що debconf намагається задати користувачеві будь-які питання:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • Потім попередньо завантажте debconf із наступним файлом preseed.txt (або будь-якими іншими налаштуваннями):

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • ви встановили вищезазначений файл, запустивши:

    debconf-set-selections /your/preseed.txt
    
  • тепер ви можете або встановити tzdata (якщо він ще не встановлений) через aptабо запустити dpkg-reconfigure. Зрештою, tzdata буде налаштовано відповідно до того, що ви вказали у своєму попередньо завантаженому файлі debconf.

Пам'ятайте, що ви можете автоматизувати набагато більше, використовуючи попереднє засівання debconf. Наприклад, у моїх попередніх насіння я завжди встановлюю:

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

Ви завжди можете перевірити налаштування debconf поточної системи, запустивши debconf-get-selections. Результат повинен дати вам деяке уявлення про те, яку частину конфігурації системи ви можете автоматизувати за допомогою попереднього засівання debconf.


4
Зрештою , я повинен був дзвонити dpkg-reconfigureз -f noninteractiveтак чи інакше ... (Ubuntu 12.04 LTS тут). В іншому випадку ваші вказівки працювали чудово!
kgadek

4
Прекрасно працює перед встановленням, але я не думаю, що це насправді працює у випадку, коли pkg вже встановлений. AFAIK спочатку потрібно видалити pkg.
напівзахищений

3
@ S.Pinkus ти маєш рацію; це потрібно видалити, /etc/{localtime,timezone}коли tzdata вже встановлено. Див. Stackoverflow.com/a/39275359/161114 .
Джа

$ 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'
Робить

3
@hbogert Ваше використання /tmp/tz- це проблема безпеки. На той час, коли ви читали від /tmp/tzінших, ви могли написати для нього інше значення або файл уже існував (що ви не перевіряли), і ви перезаписуєте його. Використовуйте, mktempщоб уникнути всіх цих проблем. Крім того, ви забуваєте видалити тимчасовий файл наприкінці. Нарешті, використання -eаргументу as як аргументу не echoє портативним, і printfзамість нього слід використовувати нові рядки.
josch

33

Існує помилка ( https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806 , не виправлена ​​на момент написання цієї відповіді) в 16.04, яка призводить /etc/timezoneдо перезапису вмісту старого значення при запуску dpkg-reconfigure -f noninteractive tzdata. Виправлення виглядає наступним чином (із наведеного вище звіту про помилки):

$ 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

Не потрібно вручну змінювати вміст /etc/timezone. Це працювало для мене на Ubuntu 16.04.2 LTS.


Найпростіший, найчистіший, найкращий. (Працює в Ubuntu 16.04.4)
Девід Табернеро М.

Це не помилка. Швидше, передбачувана поведінка ( ln -fs...) описана в коментарі №9 до цього квитка . Крім того, це питання зараз не стосується теми SO. Будь ласка, не заохочуйте питання
ЗЗ,

23

Робимо це за допомогою 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/*

У своїх експериментах я визначав необхідність видалення файлів /etc.


Примітка: Це небезпечно, ENV DEBIAN_FRONTEND...оскільки використання ENVпризведе до того, що змінна зберігатиметься у середовищі, коли контейнер також почне працювати (див. Docs.docker.com/engine/reference/builder/#env для попередження про це). Оглядаючись навколо, ви можете зрозуміти, що ARGв цій ситуації слід віддавати перевагу (наприклад ARG DEBIAN_FRONTEND...), оскільки значення змінної діє лише під час побудови контейнера.
Анон,

Хоча я з вами за паролями , клавішами API та подібними речами, це все одно залежить від конкретної ситуації, якщо ви хочете вбудувати ці значення конфігурації в зображення контейнера чи ні. Плутанина для користувачів може бути проблемою ...
Nils Ballmann

Це рішення також працює на фокусному рівні 20.04. Раніше я використовував налаштування DEBIAN_FRONTEND=...і TZ=...для bionic 18.04 і Trusty 16.04, але це не вдалося б у фокусі. Кола іншу тему на ServerFault .
minghua

12

Ось мій Dockerfileдля останнього дистрибутива Ubuntu 18.04 LTS, адаптований з відповіді @NilsBallmann. Я також видалив створення тимчасового файлу та ущільнив установку пакета в один шар:

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

11

Просування відповіді Джоша ; встановити значення debconf db і видалити/etc/{localtime,timezone} перед запуском 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.

Відомо, що цей метод працює на: -

  • Ubunty Trusty (14.04.5 LTS)

1
Вам не потрібен тимчасовий файл. Простоprintf 'tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Berlin\n' | sudo dpkg-set-selections
триплі

І я не думаю, що вам потрібно явно видаляти файли, /etcякі dpkg-reconfigureвсе одно будуть переписуватися.
триплі

Дякую тобі, ти врятував мене! Він також працює на Docker Container: debian: stretch або ubuntu.
Вагнер-ду-Кармо

3

В Ubuntu 18.04 з systemd я використовую:

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

Куди це дівається?
Марк

Схоже, що друга команда не потребує.
Андрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.