4

我正在尝试使用chef-solo. 问题是在文件中设置JAVA_HOMEPATH变量。/etc/profile我尝试使用'file'厨师提供的资源。这是我的一些代码:

java_home = "export JAVA_HOME=/usr/lib/java/jdk1.7.0_05"
path = "export PATH=$PATH:/usr/lib/java/jdk1.7.0_05/bin"

execute "make_dir" do
  cwd "/usr/lib/"
  user "root"
  command "mkdir java"
end

execute "copy" do
  cwd "/usr/lib/java"
  user "root"
  command "cp -r /home/user/Downloads/jdk1* /usr/lib/java"
end

file "/etc/profile" do
  owner "root"
  group "root"
  action :touch
  content JAVA_HOME
  content PATH
end

但问题是content命令覆盖了文件的所有内容,有没有办法在使用 chef-solo 资源时更新文件。谢谢!

更新:我从 中找到了一些代码chef-recipe,但我不确定它到底是做什么的,代码是..

ruby_block  "set-env-java-home" do
  block do
    ENV["JAVA_HOME"] = java_home
  end
end

它是仅为该实例设置 JAVA_HOME 变量还是永久设置?有人可以帮忙吗?

4

3 回答 3

13

使用Chef::Util::FileEdit。下面是我如何修改的示例.bashrc。这里的想法是我只是添加:

# Include user specific settings
if [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi

到默认值结束,.bashrc所有其他修改都发生在.bashrc_user我的食谱中。

cookbook_file "#{ENV['HOME']}/.bashrc_user" do
  user "user"
  group "user"
  mode 00644
end

ruby_block "include-bashrc-user" do
  block do
    file = Chef::Util::FileEdit.new("#{ENV['HOME']}/.bashrc")
    file.insert_line_if_no_match(
      "# Include user specific settings",
      "\n# Include user specific settings\nif [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi"
    )
    file.write_file
  end
end
于 2013-02-22T15:59:52.037 回答
1

正如@user272735 的建议,一个干净的修改方法.bashrc是:

  1. 将所有修改写入.bashrc_local文件,
  2. 将您的特定设置包括到.bashrc.

对于第 1 步,我们可以使用模板资源。对于第 2 步,我更喜欢使用line cookbook

示例代码如下,

templates/bashrc_local.erb

export JAVA_HOME=/usr/lib/java/jdk1.7.0_05
export PATH=$PATH:/usr/lib/java/jdk1.7.0_05/bin

recipes/default.rb

# add bashrc_local
template "#{ENV['HOME']}/.bashrc_local" do
  source 'bashrc_local.erb'
  mode 00644
end

# update bashrc
append_if_no_line "add bashrc_local" do
  path "#{ENV['HOME']}/.bashrc"
  line "if [ -f ~/.bashrc_local ]; then . ~/.bashrc_local; fi"
end
于 2017-05-15T07:30:44.470 回答
0

您可以通过使用模板资源而不是文件资源来解决此问题,或者如果您只是附加这两个变量,请尝试这样做:

content "#{java_home}\n#{path}"

正如您已经发现的那样,第二个内容行覆盖了第一个内容行。你也不需要action :touch.

于 2012-08-23T22:57:31.377 回答