it-swarm.com.de

Umgebungsvariablen mit Marionette festlegen

Ich verwende Vagrant mit Puppet, um virtuelle Maschinen für Entwicklungsumgebungen einzurichten. Ich möchte einfach ein paar Umgebungsvariablen in der PP-Datei festlegen. Verwendung einer virtuellen Box und einer vagrant base box für Ubuntu 64 Bit.

Ich habe das momentan.

$bar = 'bar'

class foobar {
   exec { 'foobar':
     command => "export Foo=${bar}",
   }
}

beim Provisioning erhalte ich eine Fehlermeldung: Der Befehl 'Export' wurde nicht gefunden.

Anscheinend sollte es einfach genug sein. Fehlt mir eine Art Anforderung oder Pfad für den Exec-Typ? In der Dokumentation ist mir aufgefallen, dass es eine Umgebungsoption gibt, um Umgebungsvariablen einzurichten.

19
bgrantdev

Wenn Sie nur die im Marionettenlauf verfügbaren Variablen benötigen, was ist falsch an:

Exec { environment => [ "foo=$bar" ] }

?

17
John

Die einfachste Möglichkeit, dies zu erreichen, besteht darin, Ihre Umgebung in/etc/environment abzulegen, um sicherzustellen, dass sie für alles (oder so ziemlich alles) verfügbar sind.

Etwas wie das:

class example($somevar) {
    file { "/etc/environment":
        content => inline_template("SOMEVAR=${somevar}")
    }
}

Der Grund für die Parametrisierung der Klasse ist, dass Sie sie von hiera aus mit der automatischen Variablensuche anvisieren können ( http://docs.puppetlabs.com/hiera/1/puppet.html#automatic-parameter-lookup ) ... Wenn Sie etwas in der/etc/-Umgebung halten, ist es normalerweise am besten, wenn Sie die Umgebung spezifisch machen.

note: ich habe das nur auf ubuntu getestet

16

Ich bin damit umgegangen, auch /etc/profile.d zu verwenden:

$bar = 'bar'
file { "/etc/profile.d/my_test.sh":
  content => "export Foo=${bar}",
  mode    => 755
}

Dadurch wird sichergestellt, dass die Variable $ MYVAR bei jeder Anmeldung (ex ssh) in Ihre Umgebung exportiert wird. Nachdem Sie sich über Puppet und Login (ex ssh localhost) beworben haben, gibt echo $ Foo den Balken zurück

4
Tony Z

Sie können eine Umgebungsvariable festlegen, indem Sie sie in einer Zeile in /etc/environment definieren. Sie können eine Zeile innerhalb einer Datei mithilfe von file_line in der Marionette festlegen. Kombinieren Sie diese beiden in der folgenden Lösung:

file_line { "foo_env_var":
    ensure  => present,
    line    => "Foo=${bar}",
    path    => "/etc/environment",
}
2
7yl4r

Sie könnten Folgendes versuchen, wodurch die Umgebungsvariable für diese exec festgelegt wird:

class foobar {
   exec { 'foobar' :
     command => "/bin/bash -c \"export Foo=${bar}\"",
   }
}
2
iamauser

Ich weiß, dass dies eine alte Frage ist, aber ich konnte den PS1 Prompt-Wert festlegen und ihn wie folgt zu meiner .bashrc-Datei hinzufügen:

$PS1 = '\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \$ '

und innerhalb einer Klasse:

exec {"vagrant-Prompt":
  unless =>  "grep -F 'export PS1=\"${PS1}\"' ${HOME_DIR}/.bashrc",
  command => "echo 'export PS1=\"${PS1}\"' >> ${HOME_DIR}/.bashrc",
  user => "${APP_USER}",
}

Der -F lässt grep als festen String interpretieren. Andernfalls wird es nicht gefunden und fügt die .bashrc-Datei hinzu.

0
Cameron

So etwas würde funktionieren, während vorhandene Inhalte der Datei/etc/environment beibehalten werden:

/code/environments/{environment}/manifests/environment/variable.pp:

define profile::environment::variable (
    $variable_name,
    $value,
    $ensure => present,
) {
    file_line { $variable_name:
        path   => '/etc/environment',
        ensure => $ensure,
        line   => "$variable_name=$value",
        match  => "$variable_name=",
    }
}

Verwendung (im Hauptteil eines Knotenmanifests):

profile::environment::variable { 'Java_HOME':
    variable_name  => 'Java_HOME',
    value => '/usr/lib/jvm/Java-1.8.0',
}
0
N. DaSilva