Jak zrobić plik / katalog istnieje w Puppet?

18

Usiłuję napisać funkcję w marionetce, która wykona polecenie, failjeśli podana ścieżka do katalogu nie istnieje.

if File["/some/path"]zawsze zwraca true i if defined(File["/some/path"])zwraca true tylko wtedy, gdy zasób jest zdefiniowany w marionetce, niezależnie od tego, czy faktycznie istnieje.

Czy można to zrobić za pomocą prostego ifstwierdzenia?

Dzięki

ddario
źródło
2
Pamiętaj: manifesty są kompilowane na module głównym. Nie wiedzą nic o kliencie poza faktami, które przekazuje. Napisz więc fakt zawierający te informacje lub cofnij się i powiedz nam, co tak naprawdę próbujesz rozwiązać, abyśmy mogli zaproponować lepsze podejście niż stwierdzenie if.
Dennis Kaarsemaker,

Odpowiedzi:

31

Obejście tego problemu: użyj tylko if na „teście” exec i wymagaj go w akcji, którą chcesz wykonać:

exec {"check_presence":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /path/must/be/available',
}

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
źródło
5
Och, to zło, podoba mi się :-)
Dennis Kaarsemaker
1
Może być jeszcze prościej: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker
1
Dzięki. Działa to świetnie w przypadku pojedynczego sprawdzenia katalogu. Jednak próbuję zweryfikować tablicę katalogów ... Jeśli dodam to do funkcji, pojawia się błąd „nie można ponownie ustalić”.
ddario,
6
Świetny pomysł, ale oznacza to, że przy każdym biegu Puppet pojawi się komunikat „Exec [check_presence] / return: wykonana pomyślnie”, co jest naprawdę denerwujące! Lepiej byłoby: exec {'check_presence': command => '/ bin / false', chyba że => '/ usr / bin / test -e / path / must / be / available',} To zrobi to samo, ale utworzy błąd / powiadomienie tylko wtedy, gdy ścieżka naprawdę nie istnieje.
S0me0ne
2
Wszystko, co powoduje, że „wymaganie” kończy się niepowodzeniem, spowoduje błąd, ponieważ cokolwiek ma nieudaną zależność, bez względu na to, czy używa tylko onlyif, chyba że ... Więc technicznie to działa, ale w dziennikach marionetek będzie rejestrowanych wiele błędów ...
David Gardner,
0

Ja również miałem trudności z wymyśleniem, jak uniemożliwić uruchomienie modułu, jeśli katalog nie był obecny. To, co znalazłem, działało dla mnie.

exec { 'module_name':
   command => "command to run with variables", # Double quotes for Variable interpolation
   path   => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
   onlyif => 'test -d /mydirectory',
   }

Dodanie ścieżki było tym, co naprawdę zrobiło dla mnie lewę. Z jakiegoś powodu, nawet jeśli dodałem ścieżkę do polecenia testowego, tak jakby /bin/testnie działało to poprawnie.

Mam nadzieję, że to pomoże innym, którzy mogą mieć ten sam problem.

Mike Taylor
źródło
0

Możesz również użyć do tego wbudowanej funkcji find_file () ... zwraca undef, gdy plik / ścieżka nie istnieje, i łańcuch, jeśli istnieje.

https://puppet.com/docs/puppet/5.5/function.html#findfile

Mikrofon
źródło
1
Działa to tylko na systemie głównym i służy do wyszukiwania plików w modułach.
bodgit,
Dzięki, ale możesz także użyć go do znalezienia plików w systemie operacyjnym, podając pełną ścieżkę do niego, czy nie?
Mike
Tylko na komputerze, na którym kompilowany jest katalog, tj. Na komputerze głównym.
Bodgit
tak to prawda.
Mike