Time synchronization makes lots of things work better, including:
- make
- Kerberos
- tar
- syslog
We’ve got a central NTP server on campus, and I’m using that to sync from. Puppet handles ntp and ntpdate configuration on the managed systems. Components of that setup:
- ntp.pp and ntpdate.pp classes imported from puppet/classes
- Virtualization-detecting facter recipe (originally from here, but also included below since it’s short and in case the original gets moved). This does two things: first, Xen domUs get their time from the dom0 by default. They won’t fail running ntp, but if dom0 has the wrong time, you’ll have a hard time getting any of the domUs to ever get the right time. So we’ll make sure ntp isn’t running there, as a reminder. Second, according to the virtualization recipe’s author, VMWare guests can’t run ntp at all. So we’ll disable it there, too.
/etc/puppet/facts/virtual.rb
Facter.add("virtual") do confine :kernel => :linux result = "physical" setcode do lspciexists = system "which lspci >&/dev/null" if $?.exitstatus == 0 output = %x{lspci} output.each {|p| # --- look for the vmware video card to determine # if it is virtual => vmware. # --- 00:0f.0 VGA compatible controller: VMware ... result = "vmware" if p =~ /VMware/ } end # VMware server 1.0.3 rpm places vmware-vmx in this place, # other versions or platforms may not. if FileTest.exists?("/usr/lib/vmware/bin/vmware-vmx") result = "vmware_server" end if FileTest.exists?("/proc/sys/xen/independent_wallclock") result = "xenu" elsif FileTest.exists?("/proc/xen/capabilities") txt = File.read("/proc/xen/capabilities") if txt =~ /control_d/i result = "xen0" end end result end end
/etc/puppet/manifests/classes/ntp.pp
class ntp { $ntppackage = $operatingsystem ? { Solaris => "SUNWntpu", default => "ntp" } package { $ntppackage: ensure => installed, provider => $operatingsystem ? { Solaris => "sun", default => "apt" } } file { ntpconf: path => $operatingsystem ? { Solaris => "/etc/inet/ntp.conf", default => "/etc/ntp.conf" }, owner => root, group => root, mode => 644, source => "puppet://REDACTED/ntp.conf", require => Package[$ntppackage], } service { ntp: ensure => $virtual ? { vmware => stopped, xenu => stopped, default => running }, enable => $virtual ? { vmware => false, xenu => false, default => true }, subscribe => [Package[$ntppackage], File[ntpconf]] } }
/etc/puppet/manifests/classes/ntpdate.pp
class ntpdate { package { ntpdate: ensure => installed } }
and one entry from /etc/puppet/manifests/site.pp:
node ch405l { include ntp, ntpdate }
Minor annoyances or deviations from the way things used to be configured: as of Debian 4.0, ntpdate is run when network interfaces are brought up, rather than at a user-defined time via the SysV init system. So if a system was installed with a bad time (most commonly on our dual-boot systems) and you want to avoid reboots, you’ll have to run ntpdate-debian
once to get the clock in sync with the NTP server before ntpd will do anything right.
Comments are closed.