У меня есть набор файлов конфигурации, которые необходимо развернуть в нескольких местах на каждом сервере, каждый с разным содержимым, однако все они имеют одинаковую структуру расположения. Я пытаюсь уменьшить количество репликаций в своих манифестах, создав общий класс, который можно использовать несколько раз.
Вот упрощенный пример файловой структуры:
/home/bob/config/files.cfg
/home/bob/config/settings.cfg
/home/sue/config/files.cfg
/home/sue/config/settings.cfg
/home/ann/config/files.cfg
/home/ann/config/settings.cfg
А вот манифест, который я написал.
class config-generic {
file { "/home/$name/config/files.cfg":
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
mode => 644,
}
file { "/home/$name/config/settings.cfg":
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
mode => 644,
}
}
При первом использовании класса работает нормально.
node "client1", "client2" {
class {'config-generic':
name => 'bob',
}
}
Однако, когда я снова использую этот класс, возникает ошибка, потому что класс уже определен.
(Ошибка 400 на СЕРВЕРЕ: повторяющееся определение: класс [config-generic] уже определен)
node "client1", "client2" {
class {'config-generic':
name => 'bob',
}
class {'config-generic':
name => 'sue',
}
}
Вопрос: Я понимаю проблему - но как лучше уменьшить количество репликаций в моих манифестах? Я пытаюсь избежать определения "файл'запись для каждого пользователя для каждого файла.
Вам нужен не класс, а определение, поскольку вы хотите создать их несколько экземпляров, например:
define config-generic ($ensure=present) {
file { "/home/$name/config/files.cfg":
ensure => $ensure,
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
mode => '0644',
}
file { "/home/$name/config/settings.cfg":
ensure => $ensure,
owner => $name,
group => $name,
source => "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
mode => '0644',
}
}
и назовите его:
node "client1", "client2" {
config-generic {
'bob':;
'sue':;
}
}
Вы также можете использовать шаблон, если есть небольшие различия, вместо того, чтобы дублировать исходные файлы.