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

Posted

技术标签:

【中文标题】如何使用 Chef 配方设置环境变量?【英文标题】:How can you use a Chef recipe to set an environment variable? 【发布时间】:2011-09-11 04:30:45 【问题描述】:

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

【问题讨论】:

你要设置的环境变量的上下文是什么? 你能扩展你的问题吗?好像已经回答了,除非您分享更多信息或给我们一些反馈。 【参考方案1】:

如果您需要在 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、用户配置文件等。

【讨论】:

能否请您解释一下如何通过厨师永久设置环境变量 @Prats - 查看 magic_shell 食谱 - community.opscode.com/cookbooks/magic_shell【参考方案2】:

如果您想使用 Chef 在 系统 上进行设置,请查看 magic_shell cookbook。

magic_shell_environment 'RAILS_ENV' do
  value 'production'
end

【讨论】:

只是给正在谷歌搜索的其他人的注意事项——magic_shell_environment 太棒了,只有一个陷阱。从 ruby​​ 脚本使用 system("/new/process/to/call") 调用的任何命令都不会自动从 /etc/profile.d/* 中提取 @matt 您可以通过强制交互式登录和/或在 Ruby 脚本中获取 /etc/profile 来强制执行此操作。 谢谢,@sethvargo。要更新环境变量,例如$PATH,我应该如何使用magic_shell 食谱? magic_shell_environment 'PATH' do value '$PATH:whatever' end @matt - 我的问题 (***.com/questions/22618960/…) 是否显示了您提到的潜在问题的具体示例?【参考方案3】:

如果您想在/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

【讨论】:

【参考方案4】:

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

Windows

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

windows_env 'CHEF_LICENSE' do
  value 'accept'
end

Linux

如果您只需要它来运行说明书及其子项,请使用 Ruby ENV 资源。这不会是永久性的:

ENV['CHEF_LICENSE'] = 'accept'

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

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

    创建模板脚本(如 chef.sh.erb)

    填写模板脚本:

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

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

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

这里有一些额外的资源可以阅读这里引用的不同资源:

template resourcewindows_env resource

【讨论】:

Linux 部分非常有用并且运行良好。非常感谢!【参考方案5】:

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

ENV['Var'] = 'Value'

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

【讨论】:

以上是关于如何使用 Chef 配方设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Chef 12 分发 ssh 密钥

在 Chef 食谱中使用变量

使用 OpsWorks + Chef

如果该源文件存在,如何编写Chef配方来复制文件? only_if后卫不工作

OpsWorks:如何设置 Chef 环境?

如何在 Chef 食谱中使用自定义 JSON 属性