2016-04-26 102 views
6

我需要將許多文件安裝到不是由Puppet管理的目錄中。每個文件的source位於我模塊的files/子目錄下。如何使用單個文件資源安裝多個文件

我想一次安裝它們,因爲它們的所有權和權限都是一樣的。但是我爲source投入了什麼?我希望,只需指定目錄將工作:

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

但不幸的是,木偶(使用3.7.5這裏)沒有足夠的智慧自動補齊foobar適當。

有沒有一個很好的方法來做到這一點,或者我必須刻意枚舉每個文件?謝謝!

回答

7

有多種技術來實現你在這裏做什麼,每個都有優點和缺點。

第一個,也是最明確的,它使您能夠獨立配置每個文件並查看您正在管理的文件的完整列表,即獨立定義每個文件。爲了減少代碼重複的數量,你可以使用類型默認值(儘管這並不總是合適的)。這看起來像下面這樣:

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

雖然這很明顯變得非常笨拙。

第二種策略是利用定義的類型。對於這樣的事情來說,這是一個沉重的工具,但它可以做到這一點。這將是這個樣子:

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

這就需要你在一個相對任意定義的類型添加和最終需要你,如果你想通過所有可用的核心文件的屬性添加大量的其他參數鍵入,但是對於你的情況,這就足夠了。

然而,最簡單,最乾淨的方式來做你正在嘗試的是讓文件資源利用其遞歸功能,並將所有必要的文件放到你自己的模塊目錄中(假設你有其他文件與這個目的地目錄無關)。它確實需要你允許Puppet管理目錄的存在,但是很難想象這對你來說是一個問題(因爲任何這個代碼都會失敗,如果目標目錄不存在的話)。這將是這個樣子:

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 

我敢肯定,最後一個是您理想的解決方案,您可以使用文件資源(https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse)如清洗等方面的驗證,沒有額外的文件結束在你的目的地。

還有其他的技術,但希望其中的一個會爲你做的伎倆。

+0

謝謝喬希,詳細的答案,是的,遞歸是我正在尋找的,但是'$ rcdir'不是由Puppet管理的,也不是。它是'/ etc/rc.d/init.d',並且已經包含了一堆與這個模塊無關的文件。我試圖想出一個方法,其他模塊也可以使用 - 一個設計模式,如果你願意 - 這不會做... –

+0

@MikhailT。,通過Puppet管理目錄並不需要每個文件都被管理。 –

+0

@JohnBollinger,是的,但那不是我的問題。我不希望*我的*模塊來管理這個目錄 - 因爲其他*模塊將不能... –

相關問題