35

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

我需要使用 Chef 配方设置环境变量。你能提供一个例子来说明如何做到这一点吗?

4

5 回答 5

28

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

如果您需要为执行提供程序设置一个,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 edit /etc/profile.d/chef.sh/etc/environment、用户的个人资料等。

于 2011-10-18T13:40:23.940 回答
14

如果您想使用 Chef在系统上设置它,请查看 magic_shell 食谱

magic_shell_environment 'RAILS_ENV' do
  value 'production'
end
于 2013-02-17T04:00:24.260 回答
5

如果您想在系统级别设置它/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
于 2016-04-27T16:55:43.970 回答
2

Windows 和 Linux 之间执行此操作的方法不同。最简单的方法是:

视窗

使用 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

以下是一些额外资源,可用于阅读此处引用的不同资源:

模板资源
windows_env 资源

于 2019-05-14T18:33:33.237 回答
0

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

ENV['Var'] = 'Value'

当您使用此命令时,配方启动的每个子进程都将使用此 ENV 值。您可以使用 bash 资源并回显 Var 的值来验证它。

于 2019-11-14T06:29:13.647 回答