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?
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.
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
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
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:
Remplissez le script du modèle:
#!/bin/bash export CHEF_LICENSE='accept' # Needed for Chef Infra Client 15
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:
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.