web-dev-qa-db-fra.com

Définir des variables d'environnement avec Puppet

J'utilise vagrant with puppet pour configurer des machines virtuelles pour des environnements de développement. Je voudrais simplement définir quelques variables d'environnement dans le fichier .pp. Utiliser une boîte virtuelle et une boîte de base vagabonde pour Ubuntu 64 bits.

J'ai ceci actuellement.

$bar = 'bar'

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

mais lors de la mise en service, j'obtiens une erreur: impossible de trouver la commande "export".

Cela semble être assez simple. Il me manque un type d’exigence ou un chemin pour le type d’exécutif? J'ai remarqué dans la documentation qu'il existe une option d'environnement pour configurer les variables d'environnement, devrais-je l'utiliser?

19
bgrantdev

Si vous avez seulement besoin des variables disponibles dans le cycle de marionnettes, ce qui ne va pas:

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

?

17
John

Le moyen le plus simple d’y parvenir est de placer vos envs dans/etc/environment, afin de s’assurer qu’ils sont disponibles pour tout (ou pratiquement tout).

Quelque chose comme ça:

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

La raison pour laquelle la classe est paramétrée est que vous pouvez la cibler à partir de hiera avec la recherche automatique de variable ( http://docs.puppetlabs.com/hiera/1/puppet.html#automatic-parameter-lookup ) ... Si vous collez quelque chose dans/etc/environment, il est généralement préférable de le rendre spécifique à l'environnement.

note: je n'ai testé cela que sur ubuntu

16

La façon dont je l’ai contourné est d’utiliser également /etc/profile.d:

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

Cela garantit que chaque fois que vous vous connectez (ex ssh), la variable $ MYVAR est exportée vers votre environnement. Après avoir postulé via marionnette et connecté (ex ssh localhost), echo $ Foo renverrait bar

4
Tony Z

Vous pouvez définir une variable d'environnement en la définissant sur une ligne dans /etc/environment et vous pouvez assurer une ligne dans un fichier à l'aide de file_line dans puppet. Combinez ces deux dans la solution suivante:

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

Vous pouvez essayer ce qui suit, qui définit la variable d’environnement pour cette exec:

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

Je sais que la question est ancienne, mais j’ai pu définir la valeur de l’invite PS1 et l’ajouter à mon fichier .bashrc comme suit:

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

et dans une classe:

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

Le -F fait grep il l'interprète comme une chaîne fixe. Sinon, il ne le trouvera pas et continue d’ajouter au fichier .bashrc.

0
Cameron

Quelque chose comme cela fonctionnerait tout en préservant le contenu existant du fichier/etc/environment:

/code/environments/{environmentBuch/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=",
    }
}

Utilisation (dans le corps d'un manifeste de noeud):

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