![Puppet: Wie verwende ich einen Satz gemeinsamer Pakete, lasse aber Ausnahmen zu?](https://rvso.com/image/658336/Puppet%3A%20Wie%20verwende%20ich%20einen%20Satz%20gemeinsamer%20Pakete%2C%20lasse%20aber%20Ausnahmen%20zu%3F.png)
Ich habe etwa 200 mehr oder weniger identische Linux-VMs. Es gibt eine Klasse für alle gängigen Konfigurationen:
class my_packages {
class { "::ntp":
servers => [ "de.pool.ntp.org" ],
}
....
}
die ich in jeden Knoten in site.pp einfüge.
Jetzt möchte ich meinen eigenen lokalen Zeitserver betreiben, was mit dem Paket puppetlabs/ntp ganz einfach ist. Ich muss einfach den Servereintrag in my_packages durch die IP-Adresse der neuen Zeitserver-VM ersetzen, und diese VM hat jetzt denselben NTP-Klasseneintrag, der zuvor in my_packages verwendet wurde.
node 'mytime' {
# include my_packages
class { '::ntp':
servers => [
'de.pool.ntp.org',
'ptbtime1.ptb.de',
'ptbtime2.ptb.de',
'ptbtime3.ptb.de',
],
}
...
}
Da jedoch jetzt der Eintrag der Klasse „::ntp“ im Knoten definiert ist, kann ich my_packages nicht in den Knoteneintrag für meine neue Zeitserver-VM aufnehmen, da ich in diesem Fall einen „Doppelte Deklaration“-Fehler erhalte.
Ein ähnliches Problem ist bei der Verwendung eines lokalen Nameservers aufgetreten. Jede VM hat eine /etc/resolv.conf-Datei, die auf den lokalen Nameserver verweist, daher gibt es in my_packages eine Dateiressource dafür. Der lokale Nameserver selbst muss jedoch eine andere /etc/resolv.conf-Datei haben – er kann nicht auf sich selbst verweisen, bis seine Installation abgeschlossen ist, was während der Installation nicht der Fall ist.
Was ist die beste Vorgehensweise, um einen gemeinsamen Satz von Ressourcen zu verwenden, aber gelegentliche Ausnahmen zuzulassen?
Antwort1
Wenn Sie Puppet 3 oder höher verwenden, wäre der beste Weg, dies zu erreichen, die Verwendung von Hiera zur Durchführungautomatische Parametersuche. Kurz gesagt, Sie können Klassen mit der Include-Syntax statt der Ressourcensyntax deklarieren, was bedeutet, dass Sie mehrere Deklarationen für die Klasse haben können. Beachten Sie, dass Sie Include- und Ressourcendeklarationen für eine Klasse nicht mischen können.
Wenn Sie die Include-Syntax zum Deklarieren einer Klasse verwenden, schlägt dies normalerweise fehl, wenn sie erforderliche Parameter enthält. Wenn Sie die automatische Parametersuche verwenden, versucht Puppet, die Werte für Parameter über Hiera nachzuschlagen.
Hiera heißt so, weil es versucht, Werte in einer Hierarchie von Datenquellen nachzuschlagen. Sie können diese Hierarchie in hiera.yaml angeben und sie mit verschiedenen Fakten (Hostname, benutzerdefinierte Fakten usw.) abgleichen oder hartcodierte Dateien überprüfen.
Hier ist ein kurzes Beispiel, das in Ihrem Fall funktionieren könnte:
Klassendefinition:
class my_packages {
include ::ntp
...
}
meinezeit.yaml:
----
ntp::servers:
- 'de.pool.ntp.org'
- 'ptbtime1.ptb.de'
- 'ptbtime2.ptb.de'
- 'ptbtime3.ptb.de'
common.yaml:
---
ntp::servers: ['de.pool.ntp.org']
hiera.yaml:
...
:hierarchy:
- "${::fqdn}"
- common
...
In diesem Fall würde Hiera versuchen, einen Wert für den Serverparameter in der NTP-Klasse mithilfe des Schlüssels ntp::servers nachzuschlagen. Zuerst würde es in allen YAML-Dateien, die mit dem Hostnamen übereinstimmen, nach diesem Schlüssel suchen und danach in common.yaml.
In den meisten Fällen würde es den Schlüssel in common.yaml verwenden, im Fall des Mytime-Knotens würde es jedoch einen Wert weiter oben in der Hierarchie finden und die Suche dort beenden.
Hier ist ein Link zu einemvollständiges Beispiel, das übrigens das NTP-Modul abdeckt.