有多種技術來實現你在這裏做什麼,每個都有優點和缺點。
第一個,也是最明確的,它使您能夠獨立配置每個文件並查看您正在管理的文件的完整列表,即獨立定義每個文件。爲了減少代碼重複的數量,你可以使用類型默認值(儘管這並不總是合適的)。這看起來像下面這樣:
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)如清洗等方面的驗證,沒有額外的文件結束在你的目的地。
還有其他的技術,但希望其中的一個會爲你做的伎倆。
謝謝喬希,詳細的答案,是的,遞歸是我正在尋找的,但是'$ rcdir'不是由Puppet管理的,也不是。它是'/ etc/rc.d/init.d',並且已經包含了一堆與這個模塊無關的文件。我試圖想出一個方法,其他模塊也可以使用 - 一個設計模式,如果你願意 - 這不會做... –
@MikhailT。,通過Puppet管理目錄並不需要每個文件都被管理。 –
@JohnBollinger,是的,但那不是我的問題。我不希望*我的*模塊來管理這個目錄 - 因爲其他*模塊將不能... –