Hinzufügen von Linien zu / etc / profile mit Puppet?


16

Ich benutze Puppet, um ein aktuelles JDK und einen aktuellen Kater zu installieren.

package {
    [ "openjdk-6-jdk", "openjdk-6-doc", "openjdk-6-jre",
      "tomcat6", "tomcat6-admin", "tomcat6-common", "tomcat6-docs", 
      "tomcat6-user" ]:
    ensure => present,
}

Jetzt möchte ich hinzufügen

JAVA_HOME="/usr/lib/java"
export JAVA_HOME

auf /etc/profile, diese aus dem Weg gerade zu erhalten. Ich habe noch keine eindeutige Antwort in den Dokumenten gefunden. Gibt es eine empfohlene Möglichkeit, dies zu tun?

Wie kann ich Puppet generell anweisen, diese Datei dort abzulegen oder zu ändern? Ich verwende Puppet für einen einzelnen Knoten (im Standalone-Modus), nur um es auszuprobieren und ein Protokoll des Server-Setups zu führen .


1
Wenn Sie sich für Puppet interessieren, schauen Sie in Beispiel 42 nach vorgefertigten Modulen. Sie funktionieren nicht immer so, wie Sie es möchten, aber sie sind kohärent und stabil. github.com/example42/puppet-modules
kashani

Antworten:


26

Fügen Sie eine Datei /etc/profile.d/mit dem Suffix hinzu .sh. Es wird als Teil von / etc / profile in Red Hat und Debian und Derivaten bezogen, kann man in anderen Distributionen nicht sagen. Im Allgemeinen ist es, wenn überhaupt möglich, besser, Snippets hinzuzufügen, als verteilte Dateien zu ersetzen, da dies in der Regel für die Zukunft sicherer ist.

Also in Puppet würde das folgende tun:

file { "/etc/profile.d/set_java_home.sh":
    ensure => present,
    source => ...[whatever's appropriate for your setup]...,
    ...
}

Wonach suchen Sie oder benötigen Sie mehr Details?


1
Dies funktioniert auch unter OpenSUSE und Gentoo.
Kamil Kisiel

1
Danke, das ist großartig. Habe es fast funktioniert, muss nur einen geeigneten Weg finden, um eine Datei relativ zur .ppals Quelle zu referenzieren .
Miku

1
Angenommen, Puppet 0.25 oder besser source => puppet: /// $ modulenname / $ file mit dem realen Systempfad $ modulenname / files / $ file
kashani

2
Wenn Sie die Puppet: /// $ modulename / files / $ filename-Notation verwenden, gibt IIRC 2.6.5 und höher eine Verfallswarnung aus. es sollte wie eine Marionette aussehen: /// modules / $ modulename / files / $
filename

42

Die Lösung von mark eignet sich am besten zum Hinzufügen von Inhalten zu jedem Profil. Wenn Sie jedoch sicherstellen möchten , dass sich einige Zeilen in einer Datei befinden, verfügt Puppet Labs über ein hervorragendes Modul namens stdlib, das file_line enthält, das genau das tut, was Sie benötigen. Bisher habe ich echo und grep im exec-Typ verwendet, aber file_line ist so viel einfacher und übersichtlicher.

Hier ist die Hilfe dafür:

Ensures that a given line is contained within a file. The implementation
matches the full line, including whitespace at the beginning and end. If
the line is not contained in the given file, Puppet will add the line to
ensure the desired state. Multiple resources may be declared to manage
multiple lines in the same file.

Example:

file_line { 'sudo_rule':
   path => '/etc/sudoers',
   line => '%sudo ALL=(ALL) ALL',
}
file_line { 'sudo_rule_nopw':
   path => '/etc/sudoers',
   line => '%sudonopw ALL=(ALL) NOPASSWD: ALL',
}

In this example, Puppet will ensure both of the specified lines are
contained in the file /etc/sudoers.

2
Stellen Sie sicher, dass Pluginsync auf dem Client aktiviert ist, da dies ansonsten unbemerkt fehlschlägt.
Gak

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.