web-dev-qa-db-fra.com

Comment pouvez-vous utiliser une recette Chef pour définir une variable d'environnement?

Comment pouvez-vous utiliser une recette Chef pour définir une variable d'environnement?

Je dois définir une variable d'environnement à l'aide d'une recette de chef. Pouvez-vous fournir un exemple de la manière d'y parvenir?

35
Brandon

Si vous avez besoin d'une variable env définie strictement dans le processus Chef, vous pouvez utiliser ENV['foo'] = 'bar 'car c'est un processus Ruby.

Si vous devez en définir un pour un exécuter le fournisseur , Chef expose un hachage d'environnement:

execute 'Bootstrap the database' do 
  cwd "#{app_dir}/current"
  command "#{env_cmd} rake db:drop db:create db:schema:load Rails_ENV=#{Rails_env}"
  environment 'HOME' => "/home/#{app_user}"
  user app_user
  action :run
  not_if %[psql -U postgres -c "\\l" | grep #{db_name}]
end

Si vous cherchez à définir une variable d'environnement persistante, vous souhaiterez peut-être que Chef édite /etc/profile.d/chef.sh, /etc/environment, le profil d'un utilisateur, etc.

28
jodell

Si vous souhaitez le configurer sur le système avec Chef, consultez le livre de recettes magic_Shell .

magic_Shell_environment 'Rails_ENV' do
  value 'production'
end
14
sethvargo

Si vous souhaitez le définir au niveau système dans /etc/environment, vous pouvez le faire directement selon l'exemple suivant sans ajouter de recette supplémentaire (cela ajoute deux variables env pour Java):

sys_env_file = Chef::Util::FileEdit.new('/etc/environment')
{
  'Java_HOME' => '/usr/lib/jvm/Java-1.7.0-openjdk-AMD64',
  'LD_LIBRARY_PATH' => '/usr/lib/jvm/Java-1.7.0-openjdk-AMD64/lib'
}.each do |name, val|
  sys_env_file.insert_line_if_no_match /^#{name}\=/, "#{name}=\"#{val}\""
  sys_env_file.write_file
end
4
Kent Mewhort

La façon de procéder est différente entre Windows et Linux. Le moyen le plus simple serait:

Windows

Utilisez la ressource windows_env pour créer une variable d'environnement système:

windows_env 'CHEF_LICENSE' do
  value 'accept'
end

Linux

Si vous n'en avez besoin que pour le livre de recettes et ses enfants, utilisez la ressource Ruby ENV. Ce ne sera PAS permanent:

ENV['CHEF_LICENSE'] = 'accept'

Si vous avez besoin qu'il soit permanent (et utilisez bash):

Créez un script dans /etc/profile.d:

  1. Créez un script de modèle (tel que chef.sh.erb)
  2. Remplissez le script du modèle:

    #!/bin/bash export CHEF_LICENSE='accept' # Needed for Chef Infra Client 15

  3. Mettez la ressource de modèle dans votre recette (vous pouvez définir des attributs et des paramètres de propriétaire/groupe, je voulais garder cet exemple simple)

    template '/etc/profile.d/chef.sh' do source 'chef.sh.erb' end

Voici quelques ressources supplémentaires pour lire les différentes ressources référencées ici:

ressource de modèle
ressource windows_env

2
Taegost

Pour Linux, la meilleure façon d'y parvenir est d'utiliser

ENV['Var'] = 'Value'

Lorsque vous utilisez cette commande, chaque sous-processus entraîné par la recette utilise cette valeur ENV. Vous pouvez le vérifier en utilisant une ressource bash et en faisant écho à la valeur de Var.

0
Sourav Biswas