私はディルビッシュ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がサポートしている場合は分割構成(各ボールトは独自の構成ファイルを作成し、メイン構成に含めます)。カタログを覗くには、宇宙船オペレーターですが、これではリソース間の順序を設定したり、クラス内のボールトのプロパティを設定したりすることしかできません。 のようなことはできません$vaults = Dirvish::Vault <| |>
。
最後の手段として、Ruby で何かをハックすることもできます。 では、実行の早い段階で型インスタンスがカタログに渡されるようですautorequire
。その時点で参照を保存して、後で厄介なことを実行できます。