Ich richte einderwischBackup-System mit Puppet. Dirvish hat das Konzept eines Tresors – ein in sich geschlossenes Verzeichnis, das die Backup-Daten und die Konfiguration für das, was und wie gesichert werden soll, enthält. Diese Tresore können sich überall im Dateisystem befinden, daher müssen Sie sie explizit in der Master-Dirvish-Konfigurationsdatei auflisten.
Die Art und Weise, wie ich dies mit Puppet gemacht habe, dupliziert die Informationen zu den Tresoren, indem sie zuerst als Ressourcen erstellt und dann ein Array von Tresornamen an die Master-Dirvish-Ressource übergeben werden.
# 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']
}
Die dirvish::vault
Klasse sieht ungefähr so aus
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"]
}
}
Die dirvish
Klasse verwendet die vaults
Variable in einer Vorlage
Runall:
<% vaults.each do |vault| -%>
<%= vault %>
<% end -%>
Wie kann ich diese Duplizierung entfernen?
Antwort1
Wenn Sie Ihre Konfigurationsdaten nach Hiera verschieben, kann die Vorlage dieselben Daten verwenden wie die Klasse, die die tatsächlichen dirvish::vault
s deklariert.
Erstellen Sie beispielsweise eine Struktur, die sich für die Verwendung mit eignetRessourcen erstellen:
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',
Und im Manifest:
create_resources('dirvish::vault', hiera('dirvish_vaults'), hiera('dirvish_vault_defaults'))
Die Vorlage kann denselben Hash laden und seine Schlüssel usw. iterieren.
Antwort2
Ich denke, Ihre beste Option ist die Verwendung eines Concat-Moduls, wieDasoder eine geteilte Konfiguration, wenn Dirvish dies unterstützt (jeder Tresor würde seine eigene Konfigurationsdatei erstellen, die dann in die Hauptkonfiguration aufgenommen würde). Es ist möglich, einen Blick in den Katalog zu werfen mit demRaumschiffbetreiber, aber damit könnten Sie nur die Reihenfolge zwischen den Ressourcen oder die Eigenschaften der Tresore innerhalb der Klasse festlegen. So etwas wie ist nicht möglich $vaults = Dirvish::Vault <| |>
.
Als letzten Ausweg können Sie auch etwas in Ruby hacken. Die Typinstanz scheint schon früh im Lauf an den Katalog übergeben zu werden, in autorequire
. Sie können die Referenz an diesem Punkt speichern und anschließend böse Dinge tun.