¿Agregar líneas a / etc / profile con marioneta?

16

Uso puppet para instalar un JDK y un tomcat actuales.

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

Ahora me gustaría agregar

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

a /etc/profile, solo para sacar esto del camino. Todavía no he encontrado una respuesta directa en los documentos. ¿Hay alguna forma recomendada de hacer esto?

En general, ¿cómo le digo a Puppet que coloque este archivo allí o que lo modifique? Estoy usando Puppet para un solo nodo (en modo independiente) solo para probarlo y para mantener un registro de la configuración del servidor .

miku
fuente
1
Si te estás metiendo en Puppet, mira Ejemplo42 para módulos preconstruidos. No siempre funcionan como quisieras, pero son coherentes y estables. github.com/example42/puppet-modules
kashani

Respuestas:

26

Agregue un archivo /etc/profile.d/con el sufijo .sh. Se obtendrá como parte de / etc / profile en Red Hat y Debian y derivados, no puedo decir en otras distribuciones. En términos generales, si es posible, es mejor agregar fragmentos en lugar de reemplazar archivos distribuidos, ya que tiende a ser más seguro en el futuro.

Entonces, en títeres, lo siguiente haría:

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

¿Esto es lo que estás buscando o necesitas más detalles?

marca
fuente
1
Esto también funciona en OpenSUSE y Gentoo.
Kamil Kisiel
1
Gracias, eso es genial. Lo tengo casi funcionando, solo necesito encontrar una manera apropiada de hacer referencia a un archivo relativo a la .ppfuente.
miku
1
Asumiendo Puppet 0.25 o mejor source => puppet: /// $ modulename / $ file con la ruta real del sistema siendo $ modulename / files / $ file
kashani
2
IIRC 2.6.5 y posterior emite una advertencia de desaprobación si usa la marioneta: /// $ modulename / files / $ filename notation. debería verse como una marioneta: /// modules / $ modulename / files / $ filename
ztron
42

La solución de Mark es la mejor para agregar cosas al perfil de todos, pero si alguna vez necesita asegurarse de que algunas líneas están en un archivo, Puppet Labs tiene un gran módulo llamado stdlib que incluye file_line que hará lo que necesita. Anteriormente he usado echo y grep en el tipo de ejecución para hacer esto, pero file_line es mucho más fácil y limpio.

Aquí está la ayuda para ello:

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
fuente
2
Asegúrese de tener pluginsync habilitado en el cliente, de lo contrario, esto parece fallar silenciosamente.
gak
1
aquí está el documento con anclaje directo forge.puppetlabs.com/puppetlabs/stdlib#resources
Francesco Casula