如何使用Chef配方设置环境变量?

时间:2011-06-08 20:01:14

标签: environment-variables chef chef-recipe

如何使用Chef配方设置环境变量?

我需要使用Chef配方设置环境变量。你能提供一个如何实现这个目标的例子吗?

5 个答案:

答案 0 :(得分:27)

如果您需要在Chef流程中严格设置env var,则可以使用ENV['foo'] = 'bar',因为它是一个ruby过程。

如果您需要为execute provider设置一个,则Chef会公开环境哈希:

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

如果您要设置持久性环境变量,那么您可能希望让Chef编辑/etc/profile.d/chef.sh/etc/environment,用户的个人资料等。

答案 1 :(得分:14)

如果您想使用Chef在系统上进行设置,请结帐magic_shell cookbook

magic_shell_environment 'RAILS_ENV' do
  value 'production'
end

答案 2 :(得分:4)

如果要在/etc/environment中将其设置为系统级别,则可以直接按照以下示例进行设置,而无需添加其他配方(这会为Java添加两个env变量):

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

答案 3 :(得分:0)

Windows和Linux的执行方法不同。最简单的方法是:

Windows

使用windows_env资源创建系统环境变量:

windows_env 'CHEF_LICENSE' do
  value 'accept'
end

Linux

如果您只需要菜谱运行及其子目录,则使用Ruby ENV资源。这将不是永久的:

ENV['CHEF_LICENSE'] = 'accept'

如果您需要永久使用它(并使用bash):

在/etc/profile.d中创建脚本:

  1. 创建模板脚本(例如Chef.sh.erb)
  2. 填写模板脚本:

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

  3. 将模板资源放入您的配方中(您可能想设置属性和所有者/组设置,我想让此示例保持简单)

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

这里还有一些其他资源,可以阅读此处引用的其他资源:

template resource
windows_env resource

答案 4 :(得分:0)

对于Linux,最好的方法是使用

ENV['Var'] = 'Value'

使用此命令时,配方旋转的每个子过程都将使用此ENV值。您可以使用bash资源并回显Var的值来对其进行验证。