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?
$bar::file_name
i$::file_owner
uzyskać 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.Odpowiedzi:
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_owner
zamiast 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:
Korzystając ze zmiennych globalnych, musisz zadeklarować zmienną o nazwie
$owner
w każdym węźle i nie będziesz w stanie zastąpić$file_name
zmiennej / parametru na węzeł. Zamiast tego musisz zadeklarować innąbar
klasę 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:
źródło
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ń.
źródło