获取给定类型的资源列表

获取给定类型的资源列表

我正在建立一个迪尔维什使用 puppet 的备份系统。Dirvish 有“保险库”的概念 - 一个独立的目录,其中包含备份数据以及备份内容和备份方式的配置。这些保险库可以位于文件系统中的任何位置,因此您需要在主 dirvish 配置文件中明确列出它们。

我使用 puppet 完成此操作的方式是复制有关保险库的信息,首先将它们创建为资源,然后将保险库名称数组传递给主 dirvish 资源。

  # 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使用变量vaults

Runall:
<% vaults.each do |vault| -%>
        <%= vault %>
<% end -%>

我怎样才能删除这个重复项?

答案1

如果您将配置数据移至 Hiera,则模板可以使用与声明实际的类相同的数据dirvish::vault

例如,创建一个适合使用的结构创建资源

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'))

模板可以加载相同的哈希并迭代其键等。

答案2

我认为你最好的选择是使用 concat 模块,例如或者一些拆分配置,如果 dirvish 支持的话(每个 vault 都会创建自己的配置文件,然后将其包含在主配置中)。可以使用宇宙飞船操作员,但这只允许您设置资源之间的顺序或设置类内部保管库的属性。无法执行类似这样的操作$vaults = Dirvish::Vault <| |>

作为最后的手段,您还可以破解 ruby​​ 中的某些内容。类型实例似乎在运行初期就传递了目录,在 中autorequire。您可以在此时保存引用,然后执行一些恶意操作。

相关内容