Dlaczego warto korzystać ze sparametryzowanej klasy marionetek?

12

Ogólnie, pracując ze złożonymi modułami marionetkowymi, ustawiam zmienne na poziomie węzła lub wewnątrz klasy. na przykład,

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

Jak / kiedy / dlaczego klasy parametryzowane pomagają w takiej sytuacji? Jak wykorzystujesz sparametryzowane klasy do struktury modułów marionetkowych?

robbyt
źródło
2
Uwaga dla wszystkich, którzy znajdą ten przykład, ten kod pokazuje wyszukiwanie zmiennych globalnych, które były dozwolone w wersji Puppet <3.0. W Puppet> 3.0 nie możesz uzyskać dostępu do zmiennych spoza zakresu i musisz użyć przestrzeni nazw, aby uzyskać dostęp do zmiennych. W tym przykładzie będziesz musiał użyć $bar::file_namei $::file_owneruzyskać dostęp do tych odpowiednich zmiennych. Jednak podczas korzystania z parametryzowanych klas zmienne przekazywane do klasy przez parametry stają się zmiennymi o zasięgu lokalnym.
robbyt

Odpowiedzi:

12

Klasy sparametryzowane to konstrukcja języka, która pomaga lepiej ustrukturyzować kod. Zapobiega to nadmiernemu użyciu zmiennych globalnych (jak w twoim przykładzie).

Wyobraź sobie, że umieściłeś 20 dodatkowych klas w opisie węzła i wszystkie wymagałyby pewnych zmiennych ustawionych w globalnym zasięgu lub zasięgu węzła. Również sparametryzowane klasy pozwalają na łatwe ustawienie parametrów domyślnych, dzięki czemu można użyć wartości domyślnej $file_ownerzamiast podawać tę samą wartość (np. larry) W kilku różnych miejscach.

Przykładowy fragment kodu (z dwoma dodatkowymi węzłami) można zapisać w następujący sposób:

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,
  }
}

Korzystając ze zmiennych globalnych, musisz zadeklarować zmienną o nazwie $ownerw każdym węźle i nie będziesz w stanie zastąpić $file_namezmiennej / parametru na węzeł. Zamiast tego musisz zadeklarować inną barklasę dla każdego węzła.

Dokument na temat ewolucji języka Puppet i oczywiście przewodnik językowy zawierają kilka dobrych przykładów użycia sparametryzowanych klas i uzasadnienia tej konstrukcji językowej:

joschi
źródło
8

Najlepszym sposobem na przemyślenie tego jest od samego początku, zamiast zaczynać od znajomości idiomów Lalek.

W pierwszej kolejności próbujesz przekazać parametry do klasy - podajesz informacje potrzebne do podjęcia decyzji, jak się zachować, podobnie jak przekazywanie argumentów do funkcji. Powiedzmy, że to był perl i masz funkcję o nazwie multiply_squares. Można to nazwać tak multiply_squares(3, 4), aby nie ustawiać niektórych zmiennych globalnych na 3 i 4, a następnie czytać je z wnętrza funkcji!

Ale historycznie kod Puppet musiał to robić ze zmiennymi globalnymi lub zakresem dynamicznym, ponieważ potrzeba zrobienia tego pojawiła się przed zaprojektowaniem tego języka. Osobiście uważam, że gdy sparametryzowane klasy staną się nieco bardziej rozwinięte i szerzej wdrożone, w zasadzie sprawią, że problemy ze zmiennym zakresem będą już przeszłością, ponieważ posiadanie odpowiedniego narzędzia dostępnego do zadania wyeliminuje całą warstwę przerażających włamań.

nfagerlund
źródło