2013-12-12 9 views
7

Sto provando a fornire una VM vagabonda per consentire agli utenti di fornire il proprio file bash_profile.local ma non voglio che questo file venga rintracciato nel repository vcs di vm. Ho un file di traccia bash_profile.local.dist che possono essere rinominati. Come posso dire a puppet di creare un file solo se esiste il file sorgente? Attualmente funziona correttamente ma registra un errore durante il provisioning e questo è quello che sto cercando di evitare.Come si fa a puppet copiare un file solo se la fonte esiste?

Questo è il manifesto:

class local 
{ 
    file { '.bash_profile.local': 
     source => 'puppet:///modules/local/bash_profile.local', 
     path => '/home/vagrant/.bash_profile.local', 
     replace => false, 
     mode => 0644, 
     owner => 'vagrant', 
     group => 'vagrant', 
    } 
} 

risposta

10

Si potrebbe abusare di file in questo modo:

$a = file('/etc/puppet/modules/local/files/bash_profile.local','/dev/null') 
if($a != '') { 
    file { '.bash_profile.local': 
     content => $a, 
     ... 
    } 
} 
+3

Bel trucco, grazie. Se qualcuno sta leggendo questo e chiedendosi cosa sta succedendo, file() proverà a leggere ogni file a sua volta finché non avrà successo, quindi se il primo file non esiste leggerà/dev/null che restituisce ''. – pdizz

+1

Perché non utilizzare il metodo a meno o solo nella risorsa file e nel test di bash [funzione] (http://ryanuber.com/04-17-2010/conditional-file-creation-puppet.html)? – mestachs

+0

Questo è ottimo, ma vorrei aggiungere che se copi il codice in questa risposta e inserisci una variabile nel percorso, le virgolette singole significano che le variabili non sono interpretate. Cambia le virgolette singole in virgolette se usi una variabile. (-: –

4

Questo non è esattamente quello che hai chiesto, ma puoi fornire percorsi multipli nella sorgente, in modo da può avere un file vuoto predefinito se l'utente non ha fornito il proprio.

class local 
{ 
    file { '.bash_profile.local': 
     source => [ 
      'puppet:///modules/local/bash_profile.local', 
      'puppet:///modules/local/bash_profile.local.default' 
     ], 
     path => '/home/vagrant/.bash_profile.local', 
     replace => false, 
     mode => 0644, 
     owner => 'vagrant', 
     group => 'vagrant', 
    } 
} 
0

Si può provare qualcosa di simile:

file { 'bash_profile.local': 
    ensure => present, 
    source => ['puppet:///modules/local/bash_profile.local', '/dev/null'], 
    path => '/home/vagrant/.bash_profile.local', 
    before => Exec['clean-useless-file'], 
} 
exec { 'clean-useless-file': 
    command => 'rm .bash_profile.local', 
    onlyif => 'test -s .bash_profile.local', 
    cwd  => '/home/vagrant', 
    path => '/bin:/usr/bin', 
} 

Se l'amministratore non fanno una copia di ".bash_profile.local" disponibile in "moduli/local/bash_profile.local", il risorsa file utilizzerà la seconda fonte e quindi creerà un file vuoto. Quindi, il test "onlyif" fallisce e l'exec rimuoverà il file vuoto inutile.

Utilizzato in questo modo questo codice può essere un po 'macchinoso, ma è meglio di un errore di provisioning. Puoi valutare se mantenere un file vuoto .bash_profile.local può essere ok nel tuo caso. Di solito uso una variazione di questo, con wget invece di rm, per ottenere una nuova copia del file da internet se non era già disponibile come fonte.

Se si utilizza puppetmaster, tenere presente che è possibile utilizzarlo per eseguire il provisioning del proprio server, presentando due versioni del catalogo, in base al file .bash_profile.local è presente o meno.

Problemi correlati