2016-04-26 10 views
6

Ich muss eine Reihe von Dateien in ein Verzeichnis installieren, das nicht selbst Puppet-verwaltet wird. Die source jeder Datei befindet sich unter files/ Unterverzeichnis meines Moduls.Wie installiere ich mehrere Dateien mit einer einzigen Datei-Ressource

Ich möchte sie alle auf einmal installieren, weil ihr Besitz und ihre Berechtigungen alle gleich sind. Aber was stelle ich für source? Ich hatte gehofft, einfach spezifiziert das Verzeichnis funktionieren würde:

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

aber leider Puppet (mit 3.7.5 hier) ist nicht intelligent genug, um automatisch die foo und die bar entsprechend anhängen.

Gibt es eine gute Möglichkeit, oder muss ich jede Datei mühsam aufzählen? Vielen Dank!

Antwort

7

Es gibt mehrere Techniken, um zu erreichen, was Sie hier tun, mit Vor- und Nachteilen zu jedem.

Die erste und explizitste Möglichkeit, die es Ihnen ermöglicht, jede Datei unabhängig voneinander zu konfigurieren und die vollständige Liste der von Ihnen verwalteten Dateien anzuzeigen, besteht darin, jede Datei unabhängig voneinander zu definieren. Um den Umfang der Code-Duplizierung zu reduzieren, könnten Sie type defaults verwenden (obwohl dies nicht immer angemessen ist). Dies würde in etwa so aussehen wie folgt zusammen:

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

Dies wird offensichtlich sehr unhandlich ganz schnell though.

Eine zweite Strategie wäre, einen definierten Typ zu verwenden. Es ist ein bisschen ein schweres Werkzeug für so etwas, aber es wird den Trick machen. Dies würde in etwa so aussehen:

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

Dies erfordert, dass Sie in einem relativ willkürlich definierten Art zu addieren und endet die Sie auffordert, viele andere Parameter hinzufügen, wenn Sie durch alle Eigenschaften zur Verfügung, die Core-Datei übergeben möchten tippen Sie, aber für Ihre Situation würde es ausreichen.

Die einfachste und sauberste Art zu tun, was Sie versuchen, ist, indem Sie der Datei Ressource ihre rekursive Funktionalität zu nutzen, und alle notwendigen Dateien in einem eigenen Verzeichnis in Ihrem Modul (vorausgesetzt, Sie haben andere Dateien, die haben nichts mit diesem Zielverzeichnis zu tun). Es erfordert, dass Sie Puppet erlauben, die Existenz des Verzeichnisses zu verwalten, aber es ist schwer vorstellbar, dass dies ein Problem für Sie ist (da jeder dieser Code fehlschlagen würde, wenn das Zielverzeichnis ohnehin nicht existiert). Dies würde in etwa so aussehen:

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 

Ich bin mir ziemlich sicher, dass letzte ideale Lösung ist, und Sie können andere Aspekte der Datei Ressource (https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse) wie Spülung nutzen zu bestätigen, dass keine zusätzlichen Dateien beenden in Ihrem Ziel.

Es gibt andere Techniken da draußen, aber hoffentlich wird einer von ihnen den Trick für Sie tun.

+0

Danke, Josh, für die ausführliche Antwort und, ja, 'rekursiv' ist was ich gesucht habe, aber' $ rcdir' wird nicht von Puppet hier verwaltet - noch kann es sein. Es ist das '/ etc/rc.d/init.d' und enthält bereits eine Reihe von Dateien, die nicht mit diesem Modul zusammenhängen. Ich versuche, eine Methode zu entwickeln, die andere Module auch verwenden könnten - ein Designmuster, wenn Sie so wollen - und das würde nicht funktionieren ... –

+0

@MikhailT., Das Verwalten des Verzeichnisses über Puppet erfordert das nicht Jede Datei wird verwaltet. –

+0

@JohnBollinger, ja, aber das ist nicht mein Problem. Ich will nicht, dass mein * Modul dieses Verzeichnis verwaltet - weil * andere * Module nicht in der Lage sind ... –

Verwandte Themen