Dodanie linii do / etc / profilu za pomocą marionetki?

16

Używam marionetki, aby zainstalować bieżący JDK i tomcat.

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

Teraz chciałbym dodać

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

aby /etc/profiletylko dostać to z drogi. W dokumentach nie znalazłem jednak prostej odpowiedzi. Czy istnieje zalecany sposób to zrobić?

Ogólnie, jak mam powiedzieć marionetce, aby umieścił tam ten plik lub zmodyfikował ten plik? Używam marionetki dla pojedynczego węzła (w trybie autonomicznym) tylko po to, aby go wypróbować i zachować dziennik konfiguracji serwera .

miku
źródło
1
Jeśli wchodzisz do Puppet, zapoznaj się z Przykładem 42 dla gotowych modułów. Nie zawsze działają tak, jak chcesz, ale są spójne i stabilne. github.com/example42/puppet-modules
kashani

Odpowiedzi:

26

Dodaj plik /etc/profile.d/z przyrostkiem .sh. Będzie pozyskiwany jako część / etc / profile w Red Hat i Debianie oraz pochodnych, czego nie można powiedzieć na innych dystrybucjach. Ogólnie rzecz biorąc, jeśli to w ogóle możliwe, lepiej jest dodawać fragmenty zamiast zastępować pliki rozproszone, ponieważ jest to w przyszłości bardziej bezpieczne.

Tak więc w marionetce:

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

To, czego szukasz lub potrzebujesz więcej szczegółów?

znak
źródło
1
Działa to również w OpenSUSE i Gentoo.
Kamil Kisiel
1
Dzięki, to świetnie. Już prawie działa, wystarczy znaleźć odpowiedni sposób na odniesienie pliku względem .ppźródła.
miku
1
Zakładając, że Puppet 0.25 lub lepszy source => puppet: /// $ modulename / $ file with the real system path is $ modulename / files / $ file
kashani
2
IIRC 2.6.5 i nowsze wersje emitują ostrzeżenie o wycofaniu, jeśli używasz notacji marionetka: /// $ modulename / files / $ filename. powinna ona wyglądać lalek: /// Moduły / $ modulename / pliki / $ filename
ztron
42

rozwiązanie mark jest najlepsze do dodawania elementów do profilu każdego, ale jeśli kiedykolwiek będziesz musiał upewnić się, że niektóre wiersze znajdują się w pliku, Puppet Labs ma świetny moduł o nazwie stdlib, który zawiera file_line, który zrobi to, czego potrzebujesz. Wcześniej do tego celu używałem echo i grep, ale file_line jest o wiele łatwiejszy i czystszy.

Oto pomoc na to:

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.
Mark McKinstry
źródło
2
Upewnij się, że masz włączony pluginsync na kliencie, w przeciwnym razie wydaje się to po cichu zawieść.
gak
1
oto dokument z bezpośrednią kotwicą forge.puppetlabs.com/puppetlabs/stdlib#resources
Francesco Casula