Come è possibile che un file / dir esista in Puppet?


18

Sto cercando di scrivere una funzione in Puppet che farà un failse il percorso della directory passato non esiste.

if File["/some/path"]restituisce sempre true e if defined(File["/some/path"])restituisce true solo se la risorsa è definita in pupazzo, indipendentemente dal fatto che esista effettivamente.

C'è un modo per farlo con una semplice ifdichiarazione?

Grazie


2
Ricorda: i manifest vengono compilati sul master. Non sanno nulla del cliente tranne i fatti che presenta. Quindi o scrivi un fatto che ha queste informazioni o fai un passo indietro e dicci cosa stai effettivamente cercando di risolvere in modo che possiamo trovare un approccio migliore di un'istruzione if.
Dennis Kaarsemaker,

Risposte:


31

Soluzione alternativa: utilizzare onlyif in un "test" di exec e richiederlo nella propria azione che si desidera eseguire:

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

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}

5
Oh, questo è male, mi piace :-)
Dennis Kaarsemaker,

1
Potrebbe essere ancora più semplice: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker,

1
Grazie. Funziona benissimo per un singolo controllo dir. Tuttavia, sto provando a convalidare un array di directory ... Se aggiungo questo a una funzione, ottengo un errore "Impossibile redeclare".
ddario,

6
Ottima idea, ma questo significa che su ogni corsa di marionette ci sarà un avviso "Exec [check_presence] / Returns: eseguito con successo", il che è davvero fastidioso! Meglio sarebbe: exec {'check_presence': command => '/ bin / false', a meno che => '/ usr / bin / test -e / path / must / be / available',} Questo farà lo stesso, ma creerà un errore / avviso solo quando il percorso non esiste davvero.
S0me0ne,

2
Qualunque cosa che causi il fallimento del "richiede" genererà un errore dato che qualunque cosa abbia una dipendenza fallita, sia usando soloif o a meno che ... Tecnicamente funziona ma avrai molti errori registrati nei tuoi log delle marionette ...
David Gardner,

0

Anch'io stavo avendo difficoltà a capire come impedire l'esecuzione di un modulo se non era presente una directory. Questo è quello che ho scoperto che ha funzionato per me.

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

Aggiungere il percorso è ciò che ha davvero funzionato per me. Da qualche motivo, anche se ho aggiunto il percorso al comando test in /bin/testquanto non sembra funzionare correttamente.

Spero che questo aiuti gli altri che potrebbero avere lo stesso problema.


0

Puoi anche usare la funzione integrata find_file () per esso ... restituisce undef quando il file / percorso non esiste e una stringa se esiste.

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


1
Questo verrà eseguito solo sul master ed è per la ricerca di file nei moduli.
bodgit,

Grazie, ma potresti anche usarlo per trovare file sul sistema operativo fornendo il percorso completo o no?
Mike,

Solo sulla macchina in cui viene compilato il catalogo, ovvero il master.
bodgit,

sì, è giusto.
Mike,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.