2015-05-15 7 views
6

Ich benutze Hiera, um Klassen wie webserver oder dbserver zu meinen Knoten zuzuweisen. Die Klasse webserver enthält nur Apache und setzt einige Configs darauf (z. B. Port). Offensichtlich möchte ich diese Konfiguration nicht für jeden Knoten replizieren, also stelle ich es in Common.Yaml. Allerdings wird mein common.yaml groß, also möchte ich es aufteilen. Ich möchte für die webserver Rolle eine Datei enthält, die Config haben, eine andere für die dbserver Rolle usw. Ich stelle mir vor, meine hiera.yaml etwas wie folgt aussehen:Wie kann ich meine Hiera-Konfiguration nach Rollen aufteilen?

:hierarchy: 
    - "fqdn/%{::fqdn}" 
    - "role/%{ROLE}" 
    - common 

Wo der role Ordner enthalten würde Dateien wie webserver.yaml, appserver.yaml, dbserver.yaml. Ich habe verschiedene Blogposts gesehen, die sagen, dass die Lösung darin besteht, eine benutzerdefinierte Rolle zu erstellen, aber die meisten erreichen das, indem sie diese Tatsache aus einer Datei auf dem Agentenknoten laden (zB von /etc/role), was ich zu besiegen scheint der Punkt der Puppe (ich benutze Marionette spezifisch, also muss ich mich nicht in jeden Knoten einloggen und irgendeine Konfiguration jedes Mal ändern, wenn ich will, dass es eine neue Rolle hat).

Um klar zu sein, ich möchte nicht Dateien auf dem Agenten bearbeiten müssen, um dies zum Funktionieren zu bringen, ich will alles mit der Konfiguration, die auf dem Master ist getan werden.

Ich denke, ich könnte etwas wie die folgenden und erschöpfend jede Rolle als ein Element in der Hierarchie auflisten, aber das scheint nicht so überschaubar.

:hierarchy: 
    - "fqdn/%{::fqdn}" 
    - "webserver" 
    - "appserver" 
    - "dbserver" 
    - common 

Gibt es eine Möglichkeit, dies zu lösen?

Antwort

3

Um $Role in Ihrer Hiera-Konfiguration verwenden zu können, muss es als Fakt/Variable bereitgestellt werden. Es gibt jedoch eine Möglichkeit, dies auf dem Master statt auf dem Knoten zu tun. Dies ist eines der Dinge, die für External Node Classifiers verwendet werden können.

Grundsätzlich müssen Sie ein Skript schreiben, das den Knotennamen übernimmt und yaml ausgibt, das den Wert Role enthält. Beispielsweise könnten Sie eine yaml-Datei haben, die nur eine Zuordnung von Knotennamen zu Rollen darstellt. Anschließend führt das Skript eine Suche durch und druckt das Ergebnis (als Parameter im verknüpften Schema). Hier ist an example.

Es gibt auch robustere ENCs, wenn Sie an neuen Werkzeugen interessiert sind. Zum Beispiel gibt Foreman Ihnen eine Webschnittstelle zum Gruppieren von Hosts in ähnliche Rollen, Einstellen von Parametern zum Einfügen in Marionettenläufe, etc.

1

Ich habe eine Lösung dafür gefunden. Einziger Nachteil ist, dass die maximale Anzahl der Rollen fest codiert ist. Dies wird besser mit hiera 3 bis dahin versuchen Sie dies:

/etc/puppet/hiera.yaml

--- 
:backends: 
    - yaml 
:yaml: 
    :datadir: /etc/puppet/hieradata 
:hierarchy: 
    - 'nodes/%{::clientcert}' 
    - 'roles/%{::role_4}' 
    - 'roles/%{::role_3}' 
    - 'roles/%{::role_2}' 
    - 'roles/%{::role_1}' 
    - common 

/etc/puppet/manifests/site.pp

# Get roles 
$roles = hiera_array('roles', []) 

# Declare Roles in vars (not needed in puppet 4) 
$role_1 = $roles[0] 
$role_2 = $roles[1] 
$role_3 = $roles[2] 
$role_4 = $roles[3] 

# Include Classes 
hiera_include('classes') 

/etc /puppet/hieradata/roles/webserver.yaml

--- 
classes: 
    - nginx 

# put nginx config here 

/etc/puppet/hieradata/nodes/your_node_name.yaml

--- 
roles: 
- webserver 

classes: 
# put node specific stuff here 
Verwandte Themen