Chef 更新特定用户的 .bashrc
Chef update certain user's .bashrc
我试图在安装 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 中并将路径硬编码到单个用户的主目录,代码将按预期工作。我正在尝试更新多个用户,这让我很困惑。
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
资源管理整个文件。
我试图在安装 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 中并将路径硬编码到单个用户的主目录,代码将按预期工作。我正在尝试更新多个用户,这让我很困惑。
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
资源管理整个文件。