【问题标题】:How do I edit the file content through chef recipe?如何通过厨师食谱编辑文件内容?
【发布时间】:2015-01-15 03:01:06
【问题描述】:

我已经通过厨师食谱创建了一个文件。代码如下。

execute "helloworld.txt" do
  command "mkdir /etc/#{node['jboss']['user']}"
  not_if { ::File.exists?("/etc/#{node['jboss']['user']}")}
end

file "/etc/jboss-as/helloworld.txt" do
   owner 'user'
   group 'user'
   mode 0755
   action :create_if_missing
end

template "/etc/jboss-as/helloworld.txt" do
  source "helloworld.txt.erb"
end

我的helloworld.txt文件内容如下:

TESTING 
Hello World 
Hello Winnie 
Hello Everyone 
Hello Boy

我想使用代码编辑上面的命令,将 Hello Boy 编辑为 Hello Girl,我应该使用什么命令,我需要做什么?我不想直接从 helloworld.txt 更改内容。

请在下面发表评论以显示您的解决方案。谢谢。

【问题讨论】:

    标签: chef-infra chef-recipe


    【解决方案1】:

    您一直在问一系列关于 Chef 的非常基本的问题。我强烈建议您通读一些教程和在线培训材料,而不是要求 SO 有效地为您完成工作。

    也就是说,你想要的是两个资源。首先是创建所需目录的目录资源:

    directory "/etc/#{node['jboss']['user']}" do
      user node['jboss']['user']
      mode '755'
    end
    

    这将创建所需的目录并确保所有者和模式匹配所请求的内容。这比使用 mkdir 更安全,因为它不会在所有情况下都收敛(例如,不会更正所有者/模式已更改)。

    之后您要创建文件。 Chef 中有 4 个主要选项,filecookbook_filetemplateremote_file。所有这四个都是相关的并且共享相同的核心选项(usergroupmode),但从不同的位置获取文件内容。

    file 用于编写由您的配方代码生成的内容。这对于写出诸如空文件(默认)或配方生成的 JSON/Yaml 数据之类的内容非常方便。

    cookbook_file 从说明书的files/ 部分逐字复制文件内容。这对于您不想修改的许可证密钥等二进制文件很有用,只需按原样传输到目标系统即可。

    template 类似于cookbook_file,但在写出之前通过 Erb 模板语言运行内容。这允许基于节点属性或搜索查询等内容的动态内容。

    remote_file 从提供的 URL 下载文件内容,而不是从 Chef 服务器获取。

    在这种情况下,template 可能就是您想要的:

    template "/etc/#{node['jboss']['user']}/helloworld.txt" do
      user node['jboss']['user']
      mode '644'
      source 'helloworld.txt.erb'
    end
    

    【讨论】:

    • OP 询问如何更改/附加文件。但此模板允许您使用源创建文件。有没有办法更改文件或在文件末尾附加内容?
    • 不要在一年前的内容中提出新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多