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

its*_*sme 4 ruby chef-infra

我正在尝试使用安装java 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
Run Code Online (Sandbox Code Playgroud)

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

更新:我已经找到了一些代码chef-recipe,但我不确定它究竟做了什么,代码是..

ruby_block  "set-env-java-home" do
  block do
    ENV["JAVA_HOME"] = java_home
  end
end
Run Code Online (Sandbox Code Playgroud)

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

use*_*735 13

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

# Include user specific settings
if [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi
Run Code Online (Sandbox Code Playgroud)

到默认结束时.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
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 0

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

content "#{java_home}\n#{path}"
Run Code Online (Sandbox Code Playgroud)

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