Я долго думал, использовать ли для управления DNS сервером скрипты из PuppetForge (https://forge.puppetlabs.com/)? Или держать на puppet сервере файлы конфигурации bind и рулить удаленным сервером изменяя эти файлы.
Победил второй путь. Я прекрасно умею управлять DNS сервером при помощи его конфигурационых файлов и файлов зон. Учить дополнительную обертку, написанную сторонними компаниями, на неизвестном мне ruby… Зачем так усложнять?
Поэтому, буду использовать конфигурационные файлы и тупо копировать их на машину с DNS сервером.
Создадим директорию /var/puppet.
# mkdir /var/puppet
В которой будут директории, содержащие конфигурационные файлы для отдельных машин.
# mkdir /var/puppet/centos7-2.test.local
# cd /var/puppet/centos7-2.test.local
# mkdir etc
# mkdir -p var/named/slaves
В новой директории etc разместим файл named.conf. Возьмем стандартный файл и внесем в него некоторые изменения. Не буду приводить тут весь файл, только измененные и добавленные строки.
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
allow-query { any; };
dnssec-enable no;
dnssec-validation no;
zone «test.local» IN {
type master;
file «test.local»;
allow-update { none; };
allow-query { any; };
allow-transfer { none; };
};
zone «200.168.192.in-addr.arpa» IN {
type master;
file «200.168.192»;
allow-update { none; };
allow-query { any; };
allow-transfer { none; };
};
В директории var/named создадим два файла описания зон
# cat var/named/test.local
$TTL 86400 ; 1 day
test.local. IN SOA post.test.local. artur.test.local. (
2015091701 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS centos7-2.test.local.
MX 10 post.test.local.
TXT «v=spf1 mx -all»
SPF «v=spf1 mx -all»
artur-office A 192.168.200.1
post A 192.168.200.97
centos7-2 A 192.168.200.98
centos7-1 A 192.168.200.99
# cat var/named/200.168.192
$TTL 86400 ; 1 day
200.168.192.in-addr.arpa. IN SOA post.test.local. artur.test.local. (
2015091701 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS centos7-2.test.local.
99 IN PTR centos7-1.test.local.
98 IN PTR centos7-2.test.local.
97 IN PTR post.test.local.
1 IN PTR artur-office.test.local.
Проверкой синтаксиса мы должны заниматься сами. Поэтому:
# named-checkconf etc/named.conf
# named-checkzone test.local var/named/test.local
zone test.local/IN: loaded serial 2015091701
OK
# named-checkzone 200.168.192.in-addr.arpa var/named/200.168.192
zone 200.168.192.in-addr.arpa/IN: loaded serial 2015091701
OK
Теперь необходимо что бы файловый сервер puppet узнал про нашу директорию с файлами.
# vim /etc/puppet/fileserver.conf
[configs]
path /var/puppet
allow *
Перезапустим сервер:
# systemctl restart puppetmaster
Внесем изменения в файл манифест site.pp. Сначала добавим новый класс.
class dns {
# для работы необходим пакет bind
package { ‘bind’:
ensure => installed
}
include ‘stdlib’
# Отключим ipv6 у bind.
# Для этого надо при запуске демона передать ему
# параметр -4. Добавим соответствующую строку в
# конфигурационный файл.
file_line { ‘named_no_ipv6’:
path => ‘/etc/sysconfig/named’,
line => ‘OPTIONS=»-4″‘
}
# Конфигурационный файл демона
file { «/etc/named.conf» :
ensure => file,
mode => ‘0640’,
# Путь к файлу на файловом сервере
# Я специально присвоил директории имя такое
# же как и имя машины.
# Теперь можно пользоваться переменной $fqdn
# И если у нас появится другой DNS сервер,
# то благодаря этой переменной
# мы спокойно разрулим кому какие конфиги
# отдавать.
source => «puppet:///configs/$fqdn/etc/named.conf»,
require => Package[«bind»],
# После изменения файла сделаем reload
# серверу bind
notify => Service[«named»]
}
file { «/var/named» :
path => «/var/named»,
mode => ‘0640’,
group => ‘named’,
source => «puppet:///configs/$fqdn/var/named»,
# Тут у нас передается содержимое директории
ensure => directory,
# Говорим, что бы передавались все файлы и
# поддиректории.
# Вместо remote можно использовать true.
# Тогда в целевой директории будут удаляться
# все файлы, которые отсутствуют в директории
# шаблоне.
# Поскольку делал по быстрому, пока оставлю
# так. Но в дальнейшем надо будет привести
# все в порядок.
recurse => remote,
sourceselect => all,
require => Package[«bind»],
notify => Service[«named»]
}
service { ‘named’:
enable => true,
ensure => running,
require => Package[«bind»]
}
}
Ну и изменим соответствующую ноду.
node ‘centos7-2.test.local’ {
include ‘baselinux’
include ‘dns’
}
Пока остановимся. Останется только разрулить правила фаервола.