如何使用厨师食谱在 /etc/sudoers 文件中注释一行



我想使用 Chef 注释/etc/sudoers文件中存在的"Defaults requiretty"行。如果它已经被注释了,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

正确的解决方案是使用 template 资源来控制文件内容,而不是对发行版提供的文件执行差异更新。这确保了整体收敛行为,并使得更容易在心理上对系统状态进行建模。

扩展其他答案和评论。Chef 的原则之一是食谱和食谱应该是幂等和收敛的。它们指定您希望节点处于的状态,检查需要执行哪些操作才能使其进入该状态,并仅应用这些更改。

这在逻辑上是有道理的,最大限度地减少了不必要的更改以及 Chef 的结构以在引擎盖下运行。

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

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

我们已经有了答案!

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

最新更新