bash_profile没有与chef-run一起生效

时间:2014-06-24 06:41:14

标签: environment-variables chef .bash-profile env

如果我使用chef运行以下配方,则会在~/.bash_profile中添加条目,但是当我执行echo $PATHecho $JAVA_HOME时,命令行将返回空白值。那里发生了什么?

ruby_block  "set-env-java-home" do
  block do
    ENV["JAVA_HOME"] = node['java']['path']
    ENV['PATH'] = "#{ENV['PATH']}:#{node['java']['path']}/bin"
  end
  not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }
end

bash 'set-env-bashrc' do
  code <<-EOH
    echo -e "export JAVA_HOME=$JAVA_HOME" >> ~/.bash_profile
    echo -e "export PATH=$PATH" >> ~/.bash_profile
    source ~/.bash_profile
  EOH
end

1 个答案:

答案 0 :(得分:4)

这里有一些事情:

您的not_if错误

not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }

你在这里混淆Ruby和bash。 IN Ruby $JAVA_HOME指的是全局常量。我不清楚你的not_if后卫试图完成什么,但按原样使用它肯定是不正确的。

使用bash而不是原始资源

您正在使用Bash将内容回显到文件中。这是filetemplate资源的完美工作。将是幂等的并正确处理通知:

file '~/.bash_profile` do
  content <<-EOH
    export JAVA_HOME=$JAVAHOME
    export PATH=$PATH
  EOH
end

然而,值得注意的是,你所拥有的脚本什么都不做。您要将JAVA_HOMEPATH的值设置为自己。您可能希望使用#{ENV['JAVA_HOME']}代替。

Bash是子shell资源

当您使用bash(或任何执行资源)时,您正在子shell中执行,因此sourceexport之类的内容不会持久保存到父进程。