即使在应用后卫

时间:2017-05-15 17:55:21

标签: chef chef-recipe cookbook

我正在写一个厨师的食谱,我正在使用ruby_block资源更新文件。每次我进行收敛时,它会在文件末尾添加相同的行。

为了使它具有幂等性,我还添加了一个not if guard,但它仍然不起作用。

ruby_block 'edit httpd conf' do
  block do
  rc = Chef::Util::FileEdit.new('/etc/httpd/conf/httpd.conf')
  rc.insert_line_if_no_match("IncludeOptional\ssites-enabled\/\*\.conf", 
"IncludeOptional sites-enabled/*.conf")
  rc.write_file
end
  not_if "grep \"IncludeOptional\ssites-enabled\/\*\.conf\" 
/etc/httpd/conf/httpd.conf"
end

有两件事我不清楚。

首先当我使用插入行时如果没有匹配那么为什么不检查正则表达式并更新文件。

其次是为什么not_if警卫不能正常工作。

我在这里使用正则表达式可能有问题,而且我已经在几个地方读过不使用这种方法进行文件编辑,但我想在这里添加一些内容。

请指导我更好地附加到文件或用更新的值替换文件中的内容。

2 个答案:

答案 0 :(得分:1)

使用not_if grep需要让-c只返回退出状态代码。 所以关于not_if的引用是

  

字符串作为shell命令执行。如果命令返回0,则应用保护。如果该命令返回任何其他值,则不应用guard属性

在您的情况下,它不会返回零,因此不会应用警卫。

check the grep result screenshot

答案 1 :(得分:0)

not_if { File.open('/etc/httpd/conf/httpd.conf').lines.any?{|line| line.include?('IncludeOptional sites-enabled')} }

它以这种方式使用not_if guard,它逐行计算文件,如果行存在则返回boolean。

如果不匹配应该有效,请插入行,但不知道为什么它不起作用