2016-04-26 10 views
6

Ho bisogno di installare un numero di file in una directory, che non è gestita da Puppet. Il source di ogni file è sotto la sottodirectory files/ del mio modulo.Come installare più file con una singola risorsa file

Mi piacerebbe installarli tutti in una volta, perché la proprietà e le autorizzazioni sono uguali. Ma cosa metto per source? Speravo, è sufficiente specificare la directory avrebbe funzionato:

file {[ 
    "${rcdir}/foo", "${rcdir}/bar", 
    ]: 
    source => "puppet:///${module_name}/", 
    group => 'wheel', 
    owner => 'root', 
    mode => '0644' 
    } 

ma, purtroppo, Puppet (utilizzando 3.7.5 qui) non è abbastanza intelligente per aggiungere automaticamente la foo e la bar in modo appropriato.

C'è un bel modo per farlo, o devo enumerare meticolosamente ogni file? Grazie!

risposta

7

Esistono diverse tecniche per ottenere ciò che si sta facendo qui, con vantaggi e svantaggi per ciascuno.

Il primo, e più esplicito, che ti dà la possibilità di configurare ogni file in modo indipendente così come vedere l'elenco completo dei file che stai gestendo, è quello di definire ogni file in modo indipendente. Per ridurre la quantità di duplicazione del codice, è possibile utilizzare i valori predefiniti del tipo (sebbene ciò non sia sempre appropriato). Questo sarebbe simile al seguente:

File { 
    group => 'wheel', 
    owner => 'root', 
    mode => '0644', 
} 
file { "${rcdir}/foo": 
    source => "puppet:///modules/${module_name}/foo", 
} 
file { "${rcdir}/bar": 
    source => "puppet:///modules/${module_name}/bar", 
} 

Questo ovviamente diventa molto ingombrante abbastanza rapidamente però.

Una seconda strategia consisterebbe nell'utilizzare un tipo definito. È un po 'uno strumento pesante da usare per qualcosa di simile, ma farà il trucco. Questo sarebbe simile a questa:

define myclass::file_array (
    $dest_base, 
    $source_base, 
    $group = 'wheel', 
    $owner = 'root', 
    $mode = '0644', 
) { 
    file { "${dest_base}/${name}": 
    source => "${source_base}/${name}", 
    group => $group, 
    owner => $owner, 
    mode => $mode, 
    } 
} 
class myclass(){ 
    $files_to_manage = ['foo', 'bar', 'baz'] 
    myclass::file_array { $files_to_manage: 
    source_base => "puppet:///modules/${module_name}", 
    dest_base => $rcdir, 
    } 
} 

Questo richiede di aggiungere un tipo definito relativamente arbitrario e finisce che richiede di aggiungere un sacco di altri parametri se si vuole passare attraverso tutte le proprietà disponibili per il file core tipo, tuttavia per la tua situazione sarebbe sufficiente.

Tuttavia, il modo più semplice e più pulito per eseguire ciò che si sta tentando è consentire alla risorsa file di utilizzare la sua funzionalità ricorsiva e inserire tutti i file necessari nella propria directory nel modulo (presupponendo che ci siano altri file che non sono collegati a questa directory di destinazione). Richiede che tu permetta a Puppet di gestire l'esistenza della directory, ma è difficile immaginare che questo sia un problema per te (dato che qualsiasi di questo codice fallirebbe se la directory di destinazione non esistesse già in ogni caso). Questo qualcosa sarebbe simile a questa:

file { $rcdir: 
    ensure => directory, 
    recurse => true, 
    source => "puppet:///modules/${module_name}/rc_files", 
    owner => 'root', 
    group => 'wheel', 
    mode => '0644', 
} 
// module directory 'files/rc_files' is where foo and bar would exist 

sono abbastanza sicuro che l'ultimo è la soluzione ideale, ed è possibile utilizzare altri aspetti della risorsa del file (https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse), come spurgo per verificare che nessun file aggiuntivi finiscono nella tua destinazione.

Ci sono altre tecniche là fuori, ma si spera che uno di questi farà il trucco per voi.

+0

Grazie, Josh, per la risposta dettagliata e, sì, 'ricorsivo' è quello che stavo cercando, ma' $ rcdir' non è gestito da Puppet qui - né può essere. È '/ etc/rc.d/init.d' e contiene già un mucchio di file non correlati a questo modulo. Sto cercando di trovare un metodo, che altri moduli potrebbero usare anche - un modello di progettazione, se vuoi - e questo non lo farebbe ... –

+0

@MikhailT., Gestire la directory tramite Puppet non richiede che ogni file all'interno è gestito. –

+0

@ John Bollinger, sì, ma non è un mio problema. Non voglio il * mio * modulo per gestire questa directory - perché * altri * moduli non saranno in grado di ... –

Problemi correlati