【问题标题】:updating file using 'file' chef-solo resource使用 'file' chef-solo 资源更新文件
【发布时间】:2017-05-15 15:30:44
【问题描述】:

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

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    使用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
    

    【讨论】:

    • 我更喜欢使用line cookbook 来获得更精细的处理方式。
    【解决方案2】:

    正如@user272735 的建议,修改.bashrc 的干净方法是:

    1. 将所有修改写入.bashrc_local 文件,
    2. 将您的具体设置包含在.bashrc

    对于第 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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 没错,内容“”命令会覆盖已存在的内容。我只想附加两行(环境变量)。内容命令没有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多