diff --git a/dns/manifests/init.pp b/dns/manifests/init.pp index fc9611c..e2b6f6b 100644 --- a/dns/manifests/init.pp +++ b/dns/manifests/init.pp @@ -450,43 +450,97 @@ define dns::zone($role = "master", $master = "", $slaves = [], $forwarders = [], require => File["${dns::server::chroot}${zonedir}/db.${zone}-dynamic", "${dns::server::chroot}${zonedir}/db.${zone}-dynamic.d"], } + Dns::Node::Record::Reverse <<| tag == $zone |>> { + dbdir => "${dns::server::chroot}${zonedir}/db.${zone}-dynamic.d", + notify => Exec["update-db.${zone}-dynamic"], + require => File["${dns::server::chroot}${zonedir}/db.${zone}-dynamic", + "${dns::server::chroot}${zonedir}/db.${zone}-dynamic.d"], + } } } } +# Generate dynamic DNS records for puppet node. +# +# === Global variables +# +# $dns_node_name: +# A record name. Defaults to $hostname. +# +# $dns_node_zone: +# DNS zone. Defaults to $domain. +# +# $dns_node_ipaddr: +# IP address to use in records. Defaults to $ipaddress. +# +# $dns_node_netmask: +# Netmask for determining reverse zone class. Defaults to $netmask. +# +# $dns_node_alias: +# List of names used as CNAME records. +# class dns::node { if !$dns_node_name { $dns_node_name = $::hostname } - if !$dns_node_ipaddr { - $dns_node_ipaddr = $::ipaddress - } + if !$dns_node_zone { $dns_node_zone = $::domain } + if !$dns_node_ipaddr and !$dns_node_netmask { + $dns_node_ipaddr = $::ipaddress + $dns_node_netmask = $::netmask + } else { + if !$dns_node_ipaddr or !$dns_node_netmask { + fail("Must define both \$dns_node_ipaddr and \$dns_node_netmask") + } + } + if $dns_node_alias { - $dns_node_cname = inline_template("<% dns_node_alias.each do |a| -%><%= a %>\tCNAME\t<%= dns_node_name %>\n<% end -%>") + $dns_node_cname = inline_template("<% dns_node_alias.each do |a| -%><%= a %>\tIN\tCNAME\t<%= dns_node_name %>\n<% end -%>") + } else { + $dns_node_cname = "" } @@dns::node::record { "${dns_node_name}.${dns_node_zone}": - name => $dns_node_name, - cname => $dns_node_cname, ipaddr => $dns_node_ipaddr, - tag => $dns_node_zone + host => $dns_node_name, + cname => $dns_node_cname, + tag => $dns_node_zone + } + + $dns_node_class = inline_template("<%= dns_node_netmask.scan('255.').length -%>") + $dns_node_raddr = inline_template("<%= dns_node_ipaddr.split('.').reverse.first(4-dns_node_class.to_i).join('.') -%>") + $dns_node_rzone = inline_template("<%= dns_node_ipaddr.split('.').reverse.last(dns_node_class.to_i).join('.') -%>.in-addr.arpa") + + @@dns::node::record::reverse { "${dns_node_name}.${dns_node_zone}": + ipaddr => $dns_node_raddr, + host => "${dns_node_name}.${dns_node_zone}", + tag => $dns_node_rzone } } -define dns::node::record($dbdir, $ipaddr, $name, $cname="") { +define dns::node::record($dbdir, $ipaddr, $host, $cname="") { file { "${dbdir}/rr.${name}": ensure => present, - content => "${name}\tA\t${ipaddr}\n${cname}", + content => "${host}\tIN\tA\t${ipaddr}\n${cname}", + } + +} + + +define dns::node::record::reverse($dbdir, $ipaddr, $host) { + + file { "${dbdir}/rr.${name}": + ensure => present, + content => "${ipaddr}\tIN\tPTR\t${host}.\n", } }