Я настраиваю смутный система резервного копирования с использованием марионетки. У Дирвиша есть концепция хранилища - автономного каталога, который содержит данные резервного копирования и конфигурацию того, что и как делать резервные копии. Эти хранилища могут находиться где угодно в файловой системе, поэтому вам необходимо явно указать их в файле конфигурации главного dirvish.
То, как я сделал это с помощью марионетки, дублирует информацию о хранилищах, сначала создавая их как ресурсы, а затем передавая массив имен хранилищ в главный ресурс 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 -%>
Как мне убрать это дублирование?
Если вы переместите данные конфигурации в Hiera, шаблон может использовать те же данные, что и любой класс, объявляющий фактический dirvish::vault
с.
Например, создайте структуру, которая подходит для использования с 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'))
Шаблон может загружать один и тот же хеш и перебирать его ключи и т. Д.
Я думаю, ваш лучший вариант - использовать модуль concat, например этот или некоторая раздельная конфигурация, если dirvish поддерживает ее (каждое хранилище будет создавать свой собственный файл конфигурации, который затем будет включен в основную конфигурацию). Заглянуть в каталог можно с оператор космического корабля, но это позволит вам только установить порядок между ресурсами или задать свойства хранилищ внутри класса. Невозможно сделать что-то вроде $vaults = Dirvish::Vault <| |>
.
В крайнем случае, вы также можете взломать что-нибудь на Ruby. Похоже, что экземпляр типа передается в каталог на ранней стадии выполнения, в autorequire
. Вы можете сохранить ссылку на этом этапе и потом делать неприятные вещи.