chef-run命令没有使Bash_profile生效



如果我使用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

这里有几件事:

你的not_if是错误的

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

你把Ruby和bash搞混了。在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这样的东西不会持久化到父进程。

相关内容

  • 没有找到相关文章

最新更新