首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用“文件”厨师-solo资源更新文件

使用“文件”厨师-solo资源更新文件
EN

Stack Overflow用户
提问于 2012-08-23 11:51:15
回答 3查看 4.7K关注 0票数 5

我正在尝试使用chef-solo安装java。问题是如何在JAVA_HOME文件中设置/etc/profilePATH变量。我尝试使用厨师提供的'file'资源。以下是我的一些代码:

代码语言:javascript
运行
复制
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命令覆盖了文件的所有内容,在使用厨师-solo资源的同时是否有更新文件的方法。谢谢!

更新:我从chef-recipe找到了一些代码,但我不知道它到底做了什么,代码是..

代码语言:javascript
运行
复制
ruby_block  "set-env-java-home" do
  block do
    ENV["JAVA_HOME"] = java_home
  end
end

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

EN

回答 3

Stack Overflow用户

发布于 2013-02-22 15:59:52

使用厨师::Util::FileEdit。下面是我如何修改.bashrc的一个例子。这里的想法是,我只想补充:

代码语言:javascript
运行
复制
# Include user specific settings
if [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi

到默认的末尾,.bashrc和所有其他修改都是在.bashrc_user中进行的,这是我的食谱的一部分。

代码语言:javascript
运行
复制
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
票数 14
EN

Stack Overflow用户

发布于 2017-05-15 07:30:44

作为@ clean 272735的建议,修改.bashrc的一个明确方法是:

  1. 将所有修改都写入.bashrc_local文件中,
  2. 将特定设置包含到.bashrc中。

对于步骤1,我们可以使用模板资源。对于步骤2,我更喜欢使用线菜谱

样本代码如下,

templates/bashrc_local.erb

代码语言:javascript
运行
复制
export JAVA_HOME=/usr/lib/java/jdk1.7.0_05
export PATH=$PATH:/usr/lib/java/jdk1.7.0_05/bin

recipes/default.rb

代码语言:javascript
运行
复制
# 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
票数 1
EN

Stack Overflow用户

发布于 2012-08-23 22:57:31

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

代码语言:javascript
运行
复制
content "#{java_home}\n#{path}"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12090914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档