【问题标题】:Chef update certain user's .bashrc厨师更新某些用户的 .bashrc
【发布时间】:2016-04-24 23:10:42
【问题描述】:

我正在尝试在安装 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 中并硬编码单个用户主目录的路径,则代码将按预期工作。我正在尝试更新多个用户,这就是我难过的地方。

【问题讨论】:

    标签: ruby chef-infra


    【解决方案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 资源管理整个文件。

    【讨论】:

    • 谢谢,问题是,这个配方是在我更新 JDK 后调用的,所以模板似乎不合适。非常感谢您的帮助和链接。
    • 您可能想要一个标准的 shell 初始化模板,然后创建类似 ~/.env.d/ 的东西,您可以在其中放置额外的文件,所有这些文件都来自该主模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多