【发布时间】:2011-09-11 04:30:45
【问题描述】:
如何使用 Chef 配方设置环境变量?
我需要使用 Chef 配方设置环境变量。你能举例说明如何做到这一点吗?
【问题讨论】:
-
你要设置的环境变量的上下文是什么?
-
你能扩展你的问题吗?好像已经回答了,除非您分享更多信息或给我们一些反馈。
标签: environment-variables chef-infra chef-recipe
如何使用 Chef 配方设置环境变量?
我需要使用 Chef 配方设置环境变量。你能举例说明如何做到这一点吗?
【问题讨论】:
标签: environment-variables chef-infra chef-recipe
如果您需要在 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、用户配置文件等。
【讨论】:
magic_shell 食谱 - community.opscode.com/cookbooks/magic_shell
如果您想使用 Chef 在 系统 上进行设置,请查看 magic_shell cookbook。
magic_shell_environment 'RAILS_ENV' do
value 'production'
end
【讨论】:
/etc/profile 来强制执行此操作。
$PATH,我应该如何使用magic_shell 食谱?
如果您想在/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
【讨论】:
执行此操作的方式在 Windows 和 Linux 之间有所不同。最简单的方法是:
Windows
使用 windows_env 资源创建系统环境变量:
windows_env 'CHEF_LICENSE' do
value 'accept'
end
Linux
如果您只需要它来运行说明书及其子项,请使用 Ruby ENV 资源。这不会是永久性的:
ENV['CHEF_LICENSE'] = 'accept'
如果您需要它是永久的(并使用 bash):
在 /etc/profile.d 中创建一个脚本:
填写模板脚本:
#!/bin/bash
export CHEF_LICENSE='accept' # Needed for Chef Infra Client 15
将模板资源放入您的配方中(您可能想要设置属性和所有者/组设置,我想让这个示例保持简单)
template '/etc/profile.d/chef.sh' do
source 'chef.sh.erb'
end
这里有一些额外的资源可以阅读这里引用的不同资源:
【讨论】:
对于 Linux,最好的方法是使用
ENV['Var'] = 'Value'
当您使用此命令时,配方启动的每个子进程都将使用此 ENV 值。您可以使用 bash 资源并回显 Var 的值来验证它。
【讨论】: