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


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

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.