如何使用Chef Recipe评论/ etc / sudoers文件中的一行?

时间:2016-02-04 09:22:58

标签: ruby chef chef-recipe

我想使用Chef对"Defaults requiretty"文件中的/etc/sudoers行进行评论。如果已经注释,ruby代码应该跳过评论它。我正在使用CentOS 6.7操作系统。到目前为止,我已经在我的食谱中做到了这一点:

files = Dir.glob("/home/cent/etc/*")

files.each do |file_name|
  text = File.read(sudoers)
  replace = text.gsub!(/Defaults    requiretty/, "#Defaults    requiretty")
  File.open(sudoers, "w") { |file| file.puts replace }
end

3 个答案:

答案 0 :(得分:2)

正确的解决方案是使用template资源来控制文件内容,而不是对发行版提供的文件执行差异更新。这可以确保整体收敛行为,并使系统状态的思维模型更容易。

答案 1 :(得分:1)

扩展其他答案和评论。厨师的原则之一是烹饪书和食谱应该是幂等的和趋同的。它们指定您希望节点所处的状态,它们检查需要执行哪些操作以使其进入该状态,并仅应用这些更改。

这在逻辑上是有意义的,可以最大限度地减少不必要的更改,以及Chef如何构建为在引擎盖下运行。

在您的示例中运行Ruby代码,不会添加额外的“#”符号,但它会在每次运行时更新您的文件。这是误导性的,如果某个应用程序检查文件的更新时间以查看是否发生了配置更改,则可能会产生影响。

@coderanger建议的模板资源只会在需要时更新文件。此外,模板比某些Ruby代码更清晰。这种方法是其他(好的)Chef代码必须如何工作

答案 2 :(得分:-3)

我们得到了答案!

ruby_block "replace_line" do
  block do
    file = Chef::Util::FileEdit.new("/etc/sudoers")
    file.search_file_replace_line(/Defaults    requiretty/, "#Defaults    requiretty")
    file.write_file
  end
end