Was ist der beste Weg in Puppet, um der Datei / etc / hosts einen Text hinzuzufügen?

8

Ich möchte auch die Möglichkeit behalten, die Hosts-Datei manuell zu bearbeiten, zumindest die ersten 10 Zeilen.

#Public IP's - eth0
192.168.1.103   front-01
192.168.1.106   front-02

#Private IP's - eth1
192.169.40.201  priv0-0
192.169.40.202  priv0-1
192.169.40.207  priv1-0
192.169.40.208  priv1-1

#Virtual IP's - eth0:1
192.169.50.202  vip-01
192.169.50.205  vip-02

Es wäre perfekt, wenn diese Host-Einträge unten in / etc / hosts stehen würden. Was ist der beste Weg, dies zu tun? Gibt es einen besseren Weg als das Schreiben von 8 Hosts-Zeilen-Manifesten?

# create a simple hostname and ip host entry
host { 'front-01':
    ip => '192.168.1.103',
}

Möglicherweise gibt es Servergruppen, die in ihren / etc / hosts unterschiedliche IP-Adressen / Hostnamen benötigen. Ich würde eine Vorlage verwenden, aber das bedeutet, dass Benutzer keine manuellen Änderungen mehr an ihren / etc / hosts vornehmen können, da sie von der Vorlage überschrieben würden.

ujjain
quelle

Antworten:

14

Ehrlich gesagt ist die Verwendung der hostRessource der einfachste Weg, dies zu tun. Sie müssen nur die Hosts definieren, die von Puppet gesteuert werden sollen, und Sie können den Rest der Datei weiterhin von Hand bearbeiten (obwohl Puppet in den Header eingefügt wird, der Sie auffordert, dies nicht zu tun).

Das augeasModul ist für eine Hosts-Datei zu viel des Guten, da es nur die Funktionalität der hostRessource dupliziert (obwohl es nicht im Header "Diese Datei nicht bearbeiten" hinzugefügt wird).

Wenn Sie wirklich etwas Komplizierteres oder eine genaue Kontrolle über die Platzierung von Zeilen in der Datei wünschen , verwenden Sie das concat-Modul mit einer lokalen Quelle für eines der Fragmente. In der concatDokumentation finden Sie ein Beispiel für genau diese Dinge (mithilfe der motd-Datei) .

Verwenden hostSie jedoch einfach die Ressource für die Hosts, die Sie in Puppet definieren möchten, und bearbeiten Sie die lokalen Hosts-Dateien für alles andere, was Sie benötigen.

Beachten Sie auch, dass Sie die Hostdefinitionen in Puppet ziemlich kompakt schreiben können:

host {
  # Public IPs - eth0
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';

  # Private IPs - eth1
  'priv0-0': ip => '192.169.40.201';
  'priv0-1': ip => '192.169.40.202';
  'priv1-0': ip => '192.169.40.207';
  'priv1-1': ip => '192.169.40.208';

  # Virtual IPs - eth0:1
  'vip-01': ip => '192.169.50.202';
  'vip-02': ip => '192.169.50.205';
}
Asciiphil
quelle
Diese Antwort ist ziemlich viel besser als meine :-)
Cian
1

Verwenden Sie die in Puppet integrierte Augeaus-Funktionalität. Du willst so etwas wie

augeas {
  context => "files/etc/hosts"
  changes => [
    "set <ip address> <name>",
  ],
}
Cian
quelle
0

Ein Fall, in dem Sie zusätzlich zu den Host-Ressourcentypen augeas für die Datei / etc / hosts verwenden können, sind doppelte IP-Adresszeilen.

Der Host-Ressourcentyp ermöglicht recht glücklicherweise Leitungen mit denselben IP-Adressen. (Google it; wo sind extrem dunkle Fälle, in denen es eine gute Idee sein kann.)

Wenn Sie jedoch keine doppelten IP-Adressen in Ihrer / etc / hosts-Datei haben möchten, kann Ihnen augeas helfen. Hosts ist keine Hilfe dafür.

Spitze
quelle
-1

Nur eine Methode ohne Code:

Verwenden Sie Vorlagen oder was auch immer, das eine Datei /etc/hosts.puppetmit klaren Start- und Endzeilen aktualisiert

###PUPPETSTART###
## Users: Lines between START and END will be deleted, put your own entries below 

192.168.0.1 host1
###PUPPETEND###

und haben ein Shell-Skript als Abhängigkeit, das dieses Segment ausschneidet /etc/hostsund durch den Inhalt von ersetzt /etc/hosts.puppet.

Beachten Sie, dass dies eine Racebedingung hat, wenn Benutzer die Datei bearbeiten und der Puppenlauf sie ändert. Alternativ können Sie Ihre Benutzer anweisen, eine Datei zu bearbeiten /etc/hosts.userund /etc/hostsaus beiden Dateien zu erstellen, wenn sich eine ändert.

Sven
quelle