使用'file's chef-solo资源更新文件

时间:2012-08-23 11:51:15

标签: ruby chef

我正在尝试使用chef-solo安装java。问题是在JAVA_HOME文件中设置PATH/etc/profile变量。我尝试使用chef提供的'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变量还是永久设置?有人可以帮忙吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

作为@ user272735的建议,修改.bashrc的一种简洁方法是:

  1. 将所有修改内容写入.bashrc_local文件
  2. 将您的具体设置包含在.bashrc
  3. 对于第1步,我们可以使用template resource。 对于第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
    

答案 2 :(得分:0)

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

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

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