Hiera-Suche basierend auf Muster


7

Ich versuche, mich darum zu kümmern, wie ich von etwas, das ich in meiner großen site.pp-Datei mache, in eine Struktur übergehen kann, die ich in hiera verwenden kann. Beim Lesen der Puppendokumente ist mir nicht klar, wie genau die Hiera-Daten ausgewertet werden und wann sie in das Bild passen. Ich habe kürzlich ein Upgrade von Puppet 2.7.x auf 3.3.x durchgeführt. Dies schließt die Hiera als Teil des Standardpakets ein, daher wollte ich mich endlich damit befassen, da dies mein Setup leichter lesbar / verständlich machen sollte.

Ich verwende zur Unterstützung von Systemen mehrere externe Organisationen. Dies umfasst die Konfiguration von Systemen, die für jede Organisation einzigartig sind. Oben auf meiner site.pp habe ich eine Struktur wie unten. Womit ich Fakten für jede Organisation basierend auf einem regulären Ausdruck festlege, der mit den Clientcert-Fakten übereinstimmt, die so konfiguriert und ausgegeben werden, dass sie jede Organisation zuverlässig identifizieren.

# match organization
case $::clientcert {

  /.*example1.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 1' 
        ... }
  /.*example2.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 2' 
        ... }
  /.*example3.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 3' 
        ... }
  /.*example4.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 4' 
        ... }
}

Beim Durchsuchen von Beispielen sehe ich keine Möglichkeit, in meiner hiera.yaml-Datei einen Mustervergleich durchzuführen. Ich vermute, ich muss etwas Offensichtliches vermissen.

Ich möchte mich dabei nicht auf eine benutzerdefinierte Tatsache verlassen. Ich halte mich lieber an das Client-Zertifikat, da ich sicher bin, dass dies die Organisation und das System korrekt identifiziert und mithilfe einer starken Kryptografie bestätigt wurde. Ich möchte die Werte einer Organisation nicht einer anderen Organisation geben.


Da dies Daten von etwas sind, über das der Knoten bereits verfügt (FQDN und Client-Zertifikat CN), im Gegensatz zu etwas, das Sie auf den Knoten setzen möchten, würde ich sagen, dass dies wahrscheinlich etwas ist, das nicht wirklich in Hiera gehört - Dieses bisschen Logik sollte aber gut site.ppmit einem Hiera-Setup für Ihre Klassen und Klassenparameter koexistieren ?
Shane Madden

Antworten:


1

Dazu können Sie eine Hierarchie von YAML-Dateien einrichten. Beginnen wir mit hiera.yaml:

---
:hierarchy:
    - "host/%{fqdn}"
    - "domain/%{domain}"
    - "env/%{::environment}"
    - "ops/%{operatingsystem}"
    - "os/%{osfamily}"
    - common
:backends:
    - yaml
:yaml:
    :datadir: /etc/puppet/data

Für die Ordnerstruktur können Sie jede Tatsache verwenden, die Sie in der Ausgabe von sehen können facter -y. Beispielsweise können Sie Hiera-Konfigurationsdateien für jede CPU-Architektur haben. Dann würden Sie Zeile hinzufügen

- "arch/%{::architecture}"

und hiera würde schauen, sagen wir mal rein arch/amd64.yaml

Um hiera zu debuggen, können Sie Ihre aktuellen Fakten sichern:

   $ facter -y > myhost.yaml

Und suchen Sie nach einer Variablen:

   $ hiera -y myhost.yml snmp_location --debug

Hiera geht alle Regeln durch und versucht, die Variable zu finden:

DEBUG: Mon Nov 11 11:00:23 +0100 2013: Hiera YAML backend starting
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking up snmp_location in YAML backend
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source host/myhost.example.com
...
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source ops/Ubuntu
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Cannot find datafile /etc/puppet/data/ops/Ubuntu.yaml, skipping

Für den Abgleich ist $::clientcertes möglicherweise eine gute Idee, die Top-Domain in eine separate Tatsache zu extrahieren und dann nur Yaml-Dateien zu haben, für cert/example1.org.yamldie etwa Folgendes enthalten wäre:

---
snmp_location: 'Example Org 1'

Es ist gut zu wissen, dass Sie auch dann Parameterwerte einrichten können, wenn Sie ein Modul haben, das überhaupt keinen Hiera-Funktionsaufruf enthält:

class snmp (
  $location = 'foo',
) { 
# ...
}

einige hiera config:

---
snmp::location: 'Example Org 1'

Ich glaube, ich bin in meiner Frage nicht klar genug. Mein Problem ist, dass dem Client keine Tatsache zur Verfügung gestellt wird, die ich verwenden kann, und ich keine benutzerdefinierten Fakten erstellen und dem vertrauen kann, was der Client für diese Tatsache bereitstellt. Ich muss etwas tun, das auf einer Übereinstimmung mit regulären Ausdrücken mit dem Client-Zertifikat basiert, von dem ich weiß, dass es mithilfe einer starken Kryptografie überprüft wurde. Ich möchte wissen, ob ich den Inhalt einer Variablen, die ich in meiner site.pp festgelegt habe, in meiner hiera-Konfiguration verwenden kann.
Zoredache

1
Hiera empfängt automatisch alle aktuellen Variablen von Puppet. Dies umfasst Fakten und integrierte Variablen sowie lokale Variablen aus dem aktuellen Bereich. Es gibt viele Arten von Variablen: docs.puppetlabs.com/puppet/latest/reference/lang_variables.html
Tombart

2

Ich habe aus einem ähnlichen Grund nach dem gleichen gesucht. und haben festgestellt, dass hiera in github hilfreich jjulien / hiera-regex unterstützt . Als Beispiel aus der Readme-Datei des Projekts selbst: Sie müssen ein neues Backend konfigurieren, das die Gruppierung wie folgt behandelt:

/etc/puppet/hiera.yaml:

:backends:
  - regex
  - yaml
:yaml:
  :datadir: /var/lib/hiera
:regex:
  :datadir: /var/lib/hiera
:hierarchy:
  - "fqdn/%{::fqdn}"
  - common

/var/lib/hiera/fqdn/fqdn.regex:

---
 - '^mailin-trusted.example.org$':
     postfix::smtp_relay: 'mailout-dmz.example.org'
 - '^mailout.*':
     postfix::smtp_relay: 'smtp.mailgun.org'
 - '^mailin.*':
     postfix::smtp_relay: 'localhost'

Ich sehe jedoch, dass mehrere Puppet-User-Posts und Puppetlabs-Videos davor warnen, Hiera für die Klassifizierung zu verwenden, insbesondere jetzt mit der Veröffentlichung von PE 3.7 mit dem Node Manager.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.