我想使用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
答案 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