Use puppet to set hostname?
Is there any way of setting a server's hostname using puppet?
I could write a custom type, but maybe there's a simpler way.
Thanks
[Edit] Sorry, I should've mentioned I run puppet masterless, puppet is setup first and then it sets up everything else.
Solution 1:
Take a look at my "renaming" definition for ideas. It assumes Debian, and might work on Ubuntu as well.
define rename() {
# We only need puppet so we can restart it. In practice, there's
# little point in renaming a machine through puppet without a
# running puppet service
include puppet::conf
# We only need apt because puppet management of its package
include apt
host { "$hostname": ensure => absent }
host { "$fqdn": ensure => absent }
$alias = regsubst($name, '^([^.]*).*$', '\1')
host { "$name":
ensure => present,
ip => $ipaddress,
alias => $alias ? {
"$hostname" => undef,
default => $alias
},
before => Exec['hostname.sh'],
}
file { '/etc/mailname':
ensure => present,
owner => 'root',
group => 'root',
mode => 644,
content => "${name}\n",
}
file { '/etc/hostname':
ensure => present,
owner => 'root',
group => 'root',
mode => 644,
content => "${name}\n",
notify => Exec['hostname.sh'],
}
exec { 'hostname.sh':
command => '/etc/init.d/hostname.sh start',
refreshonly => true,
notify => Service['puppet'],
}
}
define rename::domain() {
rename { "${hostname}.${name}": }
common::line { 'remove_old_domain':
ensure => absent,
file => '/etc/resolv.conf',
line => "domain $domain",
}
common::line { 'add_new_domain':
ensure => present,
file => '/etc/resolv.conf',
line => "domain $name",
}
}
Solution 2:
Create a sethostname module. Here's the init.pp
:
class sethostname {
file { "/etc/hostname":
ensure => present,
owner => root,
group => root,
mode => '0644',
content => "$::fqdn\n",
notify => Exec["set-hostname"],
}
exec { "set-hostname":
command => '/bin/hostname -F /etc/hostname',
unless => "/usr/bin/test `hostname` = `/bin/cat /etc/hostname`",
notify => Service[$rsyslog::params::service_name],
}
}
https://gist.github.com/VertigoRay/6024253