如何使用厨师食谱多行更新文件而不删除原始文件的内容

时间:2018-08-14 19:09:35

标签: ruby chef cookbook

我想在文件/var/rsyslog.conf文件中添加以下几行,而不必删除现有文件。

要包含在文件中的行是

*************
#audit log
$ModLoad imfile
$InputFileName /var/log/audit/audit.log
$InputFileTag tag_audit_log:
$InputFileStateFile audit_log
$InputFileSeverity info
$InputFileFacility local6
$InputRunFileMonitor
*.* @@172.167.189.67:514
*************

在配方中,我将以下内容作为文件资源

****
file '/etc/rsyslog.conf' do
    content ' #audit log
    $ModLoad imfile
    $InputFileName /var/log/audit/audit.log
    $InputFileTag tag_audit_log:
    $InputFileStateFile audit_log
    $InputFileSeverity info
    $InputFileFacility local6
    $InputRunFileMonitor'
    *.* @@172.167.189.67:514 --> #This value needs to be dynamically changed using String Intepolation
    mode '0644'
    owner 'root'
    group 'root'
end
****

尽管它更新了文件,但只有上面几行,并且所有其他文件内容现在都消失了

我尝试创建一个扩展名为.erb的新模板文件,顺便说一句,它也做了同样的事情。插入内容,但删除较旧的文件内容。

将文件与属性值插值一起添加的建议方式是什么。

用例:

Attribute.rb文件

default ['serverIP'] ['hostname'] =“ 172.167.189.67:514” 此属性值将是动态的,并且会定期更改。

我想在文件或模板中使用插值法,以便它选择属性文件中提供的值。

最简单的方法是什么?

谢谢

2 个答案:

答案 0 :(得分:0)

file资源用于立即管理整个文件。我们建议不要进行部分文件更新,因为这会导致Chef内核非常脆弱,但是如果需要,请查看poise-fileline食谱。

答案 1 :(得分:0)

@coderander提到,不建议在Chef中执行此操作,因为这样最好在Chef中管理整个文件。

但是,如果必须这样做(有时是这种情况),可以通过以下方式实现:

bash 'append line(s) to file if it doesnt exist' do
  user 'user'
  code <<-EOS
    cat >>/home/file <<EOL
      *.* @@172.167.189.67:514
      EOL
    EOS
  not_if "grep -q 172.167.189.67 /home/file"
end

您可能需要在该^上运行cookstyle