Давайте предположим, что у меня есть site.pp как это:
class videoServer {
file { '/root/testFile' : ensure => present }
file { '/root/testFile2' : ensure => present }
file { '/root/testFile3' : ensure => present }
}
node s1.example.comf { include videoServer }
node s2.example.comf { include videoServer }
Таким образом, у меня есть видеосервер класса с 3 в ресурсах файла и двух узлах, которые включают этот класс.
Я пытаюсь выяснить, существует ли простой способ изменить атрибуты ресурса или даже полностью исключить их. Например, я хочу исключить/root/testFile2 в узле s2.example.com. Я изменился бы, это, гарантируют атрибут для 'отсутствования'. Но каков синтаксис для этого, если он действительно существует? Если невозможно, как я должен рассмотреть класс для создания этого менее болезненным?
Да, я могу Вы использовать параметры класса как это:
class videoServer ( $fileState = present, $fileState2 = present,
$fileState3 = present ) {
...
file { '/root/testFile2' : ensure => $fileState2 }
...
...
node s2.example.com {
class { 'videoServer' : fileState2 = absent }
Но это действительно неудобно. Возможно, наследование могло помочь здесь, но я не думаю, что это - хорошее решение. Единственной разницей во многих узлах могло быть отсутствие одного файла, и я не вижу никакой смысл в наследовании в той ситуации.
Я нашел решение. На самом деле то, что я хотел сделать, возможно с помощью космического корабля <| |> Оператор
.
Поэтому, если я хочу изменить желаемое состояние файла / root / testFile2
только для узла s1.example.com
, я должен сделать примерно так:
class videoServer {
file { '/root/testFile' : ensure => present }
file { '/root/testFile2' : ensure => present }
file { '/root/testFile3' : ensure => present }
}
node s1.example.comf {
include videoServer
File <| title == '/root/testFile2' |> { ensure => absent }
}
node s2.example.comf { include videoServer }
Вы не можете удалить определение ресурса после его объявления, и вы правы, наследование класса должно использоваться очень экономно
Я бы использовал пример с параметрами вашего класса с hiera
node s1.example.comf { include videoServer }
node s2.example.comf { include videoServer }
Установка s2.example.com.yaml на
videoServer::fileState2: absent