2016-04-26 12 views
6

Potrzebuję zainstalować kilka plików w katalogu, który sam w sobie nie jest zarządzany przez kukłę. Plik source każdego pliku znajduje się w podkatalogu files/ mojego modułu.Jak zainstalować wiele plików z jednym zasobem pliku

Chciałbym zainstalować je wszystkie za jednym razem, ponieważ ich własność i uprawnienia są takie same. Ale co mam umieścić na source? Miałem nadzieję, po prostu określając katalog będzie działać:

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

ale, niestety, Marionetka (używając 3.7.5 tutaj) nie jest wystarczająco silny, aby automatycznie dołączyć foo i bar odpowiednio.

Czy jest to dobry sposób na to, czy muszę starannie wyliczyć każdy plik? Dziękuję Ci!

Odpowiedz

7

Istnieje wiele technik pozwalających osiągnąć to, co tu robisz, z ich zaletami i wadami.

Pierwszym i najbardziej jednoznacznym, który daje możliwość samodzielnego konfigurowania każdego pliku, jak również pełnej listy zarządzanych plików, jest samodzielne definiowanie każdego pliku. Aby zmniejszyć liczbę duplikacji kodu, można użyć wartości domyślnych typów (choć nie zawsze jest to właściwe). To wyglądałoby mniej więcej tak:

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

To jednak szybko staje się bardzo nieporęczne.

Druga strategia polegałaby na wykorzystaniu zdefiniowanego typu. To trochę ciężkie narzędzie do wykorzystania w takich sytuacjach, ale to wystarczy. To będzie wyglądać mniej więcej tak:

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

Wymaga to dodać w stosunkowo arbitralne określonego rodzaju i kończy się konieczności można dodać wiele innych parametrów, jeśli chcesz przejść przez wszystkich właściwości dostępnych do pliku rdzenia typ, jednak dla twojej sytuacji wystarczyłoby.

Jednak najprostszym i najczystszym sposobem wykonania tego, co próbujesz, jest zezwolenie zasobowi plikow na wykorzystanie jego funkcji rekurencyjnych i umieszczenie wszystkich niezbędnych plików w ich własnym katalogu w module (zakładając, że masz inne pliki, które nie są powiązane z tym katalogiem docelowym). Wymaga, aby zezwolić marionetce na zarządzanie istnieniem katalogu, ale trudno jest wyobrazić sobie, że jest to dla ciebie problem (ponieważ którykolwiek z tych kodów nie powiedzie się, jeśli katalog docelowy jeszcze nie istniał). To coś będzie wyglądać następująco:

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 

Jestem pewien, że ostatni z nich jest idealnym rozwiązaniem, można wykorzystać inne aspekty zasobów plików (https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse), takie jak czystki, aby potwierdzić, że żadne dodatkowe pliki końca do miejsca docelowego.

Są inne techniki, ale mam nadzieję, że jedno z nich zrobi dla ciebie lewę.

+0

Dzięki, Josh, za szczegółową odpowiedź i, tak, "rekurencyjne" jest tym, czego szukałem, ale '$ rcdir' nie jest zarządzany przez Puppet tutaj - ani nie może być. Jest to '/ etc/rc.d/init.d' i zawiera już kilka plików niezwiązanych z tym modułem. Próbuję wymyślić metodę, której mogą użyć inne moduły - wzór wzorca, jeśli zechcesz - i to by nie działało ... –

+0

@MikhailT., Zarządzanie katalogiem za pośrednictwem Puppet nie wymaga tego każdy plik wewnątrz jest zarządzany. –

+0

@JohnBollinger, tak, ale to nie jest mój problem. Nie chcę, aby * mój * moduł zarządzał tym katalogiem - ponieważ * inne * moduły nie będą w stanie ... –

Powiązane problemy