Chef更新某些用户的.bashrc

时间:2016-04-24 23:10:42

标签: ruby chef

我正在尝试在安装JDK后更新某些用户.bashrc JAVA_HOME环境变量。我得到了这个我不明白的奇怪错误。这是有问题的代码块。

node['etc']['passwd'].each do |user, data|
  only_if {data['uid'] > 9000}
  jdk_dir_array = Dir.entries('/usr/java/').select {|entry| File.directory? File.join('/usr/java/',entry) and !(entry =='.' || entry == '..') }
  jdk_dir_name = jdk_dir_array.shift
  file = Chef::Util::FileEdit.new("#{data['dir']}/.bashrc")
  file.search_file_replace( /JAVA_HOME=.*/,"JAVA_HOME=/usr/java/#{jdk_dir_name}")
  file.write_file
end

我得到的错误是:

NoMethodError
-------------
No resource or method named `only_if' for `Chef::Recipe "install_jdk"'

我不明白为什么当我在node.each块中声明它时,它认为“only_if”是一个方法的方法。

我应该指出,如果我把它放在ruby_block并硬编码到单个用户的主目录的路径,代码按预期工作。我正在尝试更新多个用户,这就是我难倒的地方。

1 个答案:

答案 0 :(得分:1)

only_if是您在资源上使用的方法,不是在配方中或在ruby_block的块内。你想要的更像是:

node['etc']['passwd'].each do |user, data|
  ruby_block "edit #{user} bashrc" do
  only_if { data['uid'] > 9000 }
  block do
    jdk_dir_array = Dir.entries('/usr/java/').select {|entry| File.directory? File.join('/usr/java/',entry) and !(entry =='.' || entry == '..') }
    jdk_dir_name = jdk_dir_array.shift
    file = Chef::Util::FileEdit.new("#{data['dir']}/.bashrc")
    file.search_file_replace( /JAVA_HOME=.*/,"JAVA_HOME=/usr/java/#{jdk_dir_name}")
    file.write_file
  end
end

我真的建议不要这样做。查看line cookbook以获得更精确的方法来解决此问题,或者考虑让Chef通过template资源管理整个文件。