【问题标题】:bash_profile is not taking effect with chef-runbash_profile 未与 chef-run 一起生效
【发布时间】:2014-08-14 07:41:57
【问题描述】:

如果我使用厨师运行以下食谱,则会在 ~/.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

【问题讨论】:

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


【解决方案1】:

这里有几件事:

您的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 之类的内容不会持久化到父进程。

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 2018-09-08
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多