Я настраиваюдирвишСистема резервного копирования с использованием 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
s.
Например, создать структуру, которая пригодна для использования ссоздать_ресурсы:
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
. Вы можете сохранить ссылку в этой точке и делать гадости после этого.