automate dpkg-reconfigure tzdata
Solution 1
You need to specify the frontend as `noninteractive' and it will save your current settings.
dpkg-reconfigure will take the current system settings as gospel, so simply change your timezone the way you would normally and run it with the non-interactive flag
e.g. for me to change to "Europe/Dublin" where I am:
# echo "Europe/Dublin" > /etc/timezone
# dpkg-reconfigure -f noninteractive tzdata
Obviously this allows you to use puppet/cfengine as you like to distribute /etc/timezone also.
EDIT:
after @gertvdijk comment pointing to https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806 and @scruss answer you will probably have to do it like this in most modern distributions:
$ sudo ln -fs /usr/share/zoneinfo/Europe/Dublin /etc/localtime
$ sudo dpkg-reconfigure -f noninteractive tzdata
Solution 2
Since the accepted answer no longer works (Debian Jessie, April 2017), an approach modified from @gertvdijk's comment link appears to do the job now:
sudo ln -fs /usr/share/zoneinfo/Europe/Dublin /etc/localtime
sudo dpkg-reconfigure -f noninteractive tzdata
Solution 3
You should be able to use debconf-set-selections to preset the configuration. Install debconf-utils and run debconf-get-selections | grep tzdata
on a properly configured system to figure out what to set it too.
Solution 4
You can also use the recipe from the (now defunct) Puppet wiki (archive) which replaces /etc/localtime
with the appropriate zoneinfo file from /usr/share/zoneinfo
:-
class timezone {
package { "tzdata":
ensure => installed
}
}
class timezone::central inherits timezone {
file { "/etc/localtime":
require => Package["tzdata"],
source => "file:///usr/share/zoneinfo/US/Central",
}
}
class timezone::eastern inherits timezone {
file { "/etc/localtime":
require => Package["tzdata"],
source => "file:///usr/share/zoneinfo/US/Eastern"
}
}
class timezone::pacific inherits timezone {
file { "/etc/localtime":
require => Package["tzdata"],
source => "file:///usr/share/zoneinfo/US/Pacific"
}
}
class timezone::mountain inherits timezone {
file { "/etc/localtime":
require => Package["tzdata"],
source =>
"file:///usr/share/zoneinfo/US/Mountain"
}
}
I'm not sure if dpkg-reconfigure does anything extra, but I have used the above recipe and it works perfectly.
Related videos on Youtube
Elrond
Updated on September 17, 2022Comments
-
Elrond over 1 year
I'm using puppet to admin a cluster of debian servers. I need to change the timezone of each machine on the cluster. The proper debian way to do this is to use
dpkg-reconfigure tzdata
. But I can only seem to change it if I use the dialog. Is there some way to automate this from the shell so I can just write an Exec to make this easy?If not, I think the next best way would probably be to have puppet distribute
/etc/timezone
and/etc/localtime
with the correct data across the cluster.Any input appreciated!
-
Dan Dascalescu about 5 yearsNote that the currently accepted answer has been wrong since 2017. The correct answer is this one.
-
-
Elrond almost 10 yearsFor things that are debconf based, this should work. But tzdata prefers the config from /etc/timezone. So this does not work on an already installed (wheezy) system.
-
spinkus over 9 yearsman tzselect: "Note that tzselect will not actually change the timezone for you. Use 'dpkg-reconfigure tzdata' to achieve this."
-
NDBoost over 9 yearsas an alternative to changing permissions, you could do something like this.
echo 'Europe/Dublin' | sudo tee /etc/timezone > /dev/null
-
MartyMacGyver over 8 yearsFor completeness, another way to echo via sudo is
sudo bash -c 'echo "Europe/Dublin" > /etc/timezone'
-
gertvdijk over 7 yearsHeads up! Newer Ubuntu/Debian versions don't work this way anymore. Behaviour changed. bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806