14

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.

2
  • There may be one, but i don't know of one. I suspect there isn't because the server signs the client's certificate that includes the hostname. Normally the hostname is set during deployment, then puppet installed and linked to the server. I don't know how you'd automate the setting of it after install time via puppet.
    – Sirex
    Jan 31, 2012 at 12:45
  • Sorry, I should've mentioned I run puppet masterless, puppet is setup first and then it sets up everything else. Jan 31, 2012 at 12:47

2 Answers 2

10

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",
    }
}
1
  • I essentially do the same thing, except I also have a file resource for /etc/resolv.conf, setting my domain. I run masterless as well. Feb 1, 2012 at 15:49
1

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

1
  • notice that $fqdn must be correct value. You can also remove $rsyslog line.
    – confiq
    Sep 9, 2015 at 14:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.