Параметризованные классы - это языковая конструкция, которая поможет вам лучше структурировать ваш код. Это предотвращает чрезмерное использование глобальных переменных (как в вашем примере).
Представьте, что вы включили еще 20 классов в описание вашего узла, и всем понадобилось бы установить некоторые переменные в глобальной области манифеста или в области узла. Кроме того, параметризованные классы позволяют легко иметь параметры по умолчанию, поэтому вы можете использовать значение по умолчанию $file_owner
вместо того, чтобы указывать одно и то же значение (например larry
) в нескольких разных местах.
Ваш пример фрагмента (с двумя дополнительными узлами) может быть записан следующим образом:
node 'example.com' {
class { bar: }
}
node 'example.net' {
class { bar: owner = "harry" }
}
node 'example.net' {
class { bar: file_name = "barry.txt" }
}
class bar($owner = "larry", $file_name = "larry.txt") {
class { do_stuff: owner => $owner, file_name => $file_name }
}
class do_stuff($owner, $file_name) {
file { $file_name:
ensure => file,
owner => $owner,
}
}
При использовании глобальных переменных вам нужно будет объявить переменную с именем $owner
в каждом узле, и вы не сможете перезаписать $file_name
переменную / параметр для каждого узла. Вместо этого вам нужно объявить другой bar
класс для каждого узла.
Документ об эволюции языка Puppet и, конечно же, руководство по языку предоставляют несколько хороших примеров того, как использовать параметризованные классы и обоснование этой языковой конструкции:
$bar::file_name
и$::file_owner
обращаться к этим соответствующим переменным. Однако при использовании параметризованных классов переменные, передаваемые в класс через параметры, становятся переменными локальной области видимости.