我正在使用傀儡build立一个强大的备份系统。 Dirvish有一个Vault的概念 – 一个自包含的目录,其中包含备份数据和configuration以及如何备份。 这些保pipe库可以在文件系统中的任何地方,所以你需要明确地列出它们在主dirvishconfiguration文件中。
我用木偶做的这种方式复制了有关保pipe库的信息,首先将它们创build为资源,然后将一系列保pipe库名称传递给主驱动器资源。
# Dirvish vaults, alphabetically sorted dirvish::vault { 'server-a-full': client => 'server-a', tree => '/', backup_root => $dirvish_backup_root } dirvish::vault { 'server-b-example.com': client => 'server-b', tree => '/srv/www/vhosts/example.com/backup', rsync_option => '--copy-unsafe-links', backup_root => $dirvish_backup_root } # TODO - we duplicate the vault definitions here, but I don't # see a better way right now class {'dirvish': backup_root => $dirvish_backup_root, vaults => ['server-a-full', 'server-b-example.com'] }
dirvish::vault类看起来像这样
define dirvish::vault($tree, $client, $exclude = [], $rsync_option = '', $backup_root) { file {"$backup_root/$name/dirvish/default.conf": ensure => present, content => template("dirvish/vault.conf.erb"), require => File["$backup_root/$name/dirvish"] } }
dirvish类在模板中使用vaultsvariables
Runall: <% vaults.each do |vault| -%> <%= vault %> <% end -%>
我怎样才能删除这个重复?
如果将configuration数据移动到Hiera,模板可以使用与任何类声明实际dirvish::vault相同的数据。
例如,创build一个适用于create_resources的结构 :
dirvish_vault_defaults: backup_root: "<backup-root-value>" dirvish_vaults: 'server-a-full': client: 'server-a', tree: '/', 'server-b-example.com': client: 'server-b', tree: '/srv/www/vhosts/example.com/backup', rsync_option: '--copy-unsafe-links',
在清单中:
create_resources('dirvish::vault', hiera('dirvish_vaults'), hiera('dirvish_vault_defaults'))
该模板可以加载相同的散列并迭代其键等。
我认为你最好的select是使用一个concat模块,像这样或者一些拆分configuration,如果dirvish支持的话(每个vault都会创build自己的configuration文件,然后包含在主configuration中)。 使用飞船操作员可以查看目录,但是这只允许您设置资源之间的顺序或设置类内保险库的属性。 不可能做$vaults = Dirvish::Vault <| |> $vaults = Dirvish::Vault <| |> 。
作为最后的手段,你也可以用ruby破解一些东西。 types实例似乎在运行的早期通过autorequire 。 你可以保存这个参考,然后做一些讨厌的事情。