Mongodb 使用厨师配方修改配置文件中的单行

Mongodb 使用厨师配方修改配置文件中的单行,mongodb,chef-infra,Mongodb,Chef Infra,我正在尝试使用厨师食谱自动禁用MongoDB的透明巨型页面(THP)设置 此处解释了THP设置: 我试图通过编辑位于“/etc/grub.conf”的grub配置文件来遵循第一个选项“在启动时配置(首选)” 我所需要做的就是将“transparent_hugepage=never”附加到以“kernel”开头的现有行的末尾 我知道我可以用这样的方式将一行替换为: ruby_block "replace_line" do block do file = Chef::Util::File

我正在尝试使用厨师食谱自动禁用MongoDB的透明巨型页面(THP)设置

此处解释了THP设置:

我试图通过编辑位于“/etc/grub.conf”的grub配置文件来遵循第一个选项“在启动时配置(首选)”

我所需要做的就是将“transparent_hugepage=never”附加到以“kernel”开头的现有行的末尾

我知道我可以用这样的方式将一行替换为:

ruby_block "replace_line" do
  block do
    file = Chef::Util::FileEdit.new("/etc/grub.conf")
    file.search_file_replace_line("/kernel/", "kernel <kernel path> <kernel options> transparent_hugepage=never")
    file.write_file
  end
end
ruby_块“替换_行”do
布洛克道
file=Chef::Util::FileEdit.new(“/etc/grub.conf”)
file.search\u file\u replace\u行(“/kernel/”,“kernel transparent\u hugepage=never”)
file.write\u文件
结束
结束
但是我需要保留现有的内核路径和内核选项

我尝试过使用,但没有成功初始化构造函数。Chef::Util::FileEdit是用一个文件路径初始化的(如上所述),但是ruby文档说Chef::Util::Editor是用“行”初始化的。我试过了

lines = Chef::Util::Editor.new(<lines>) 
lines=Chef::Util::Editor.new()
其中
=文件路径,=Chef::Util::FileEdit.new(),和='teststring',但似乎没有任何效果

有人有使用Chef::Util::Editor的经验吗?还是更好的解决方案


谢谢

我从来没有想到如何使用Chef修改配置文件中的一行,但这里是我最后用来禁用MongoDB的THP设置的方法

方法:安装MongoDB

# Install MongoDB on Amazon Linux
# http://docs.mongodb.org/manual/tutorial/install-mongodb-on-amazon/

# 1: configure the package management system (yum)

# 2: install mongodb

# 3: configure mongodb settings

# 3.A: give mongod permission to files
# data & log directories (everything in /srv/mongodb)
# http://stackoverflow.com/questions/7948789/mongodb-mongod-complains-that-there-is-no-data-db-folder
execute "mongod_permission" do
    command "sudo chown -R mongod:mongod /srv/mongodb"
    #command "sudo chown mongod:mongod /var/run/mongodb/mongod.pid"
    #command "sudo chown -R $USER /srv/mongodb"
end

# 3.B: edit Transparent Huge Pages (THP) Settings
# get rid of mongod startup warning
# http://docs.mongodb.org/manual/reference/transparent-huge-pages/#transparent-huge-pages-thp-settings

# 3.B.1: disable
execute "disable_thp_khugepaged_defrag" do
    command "echo 0 | sudo tee /sys/kernel/mm/transparent_hugepage/khugepaged/defrag" # different b/c file doesn't have options list
end
execute "disable_thp_hugepage_defrag" do
    command "echo 'never > /sys/kernel/mm/transparent_hugepage/defrag' | sudo tee --append /sys/kernel/mm/transparent_hugepage/defrag"
end
execute "disable_thp_hugepage_enables" do
    command "echo 'never > /sys/kernel/mm/transparent_hugepage/enabled' | sudo tee --append /sys/kernel/mm/transparent_hugepage/enabled"
end

# 3.B.2: verify disabled on reboot
template "/etc/rc.local" do
    source "init-rc.local.erb"
    owner 'root'
    group 'root'
    mode '0775'
end

# 4: use upstart & monit to keep mongod alive
模板:init rc.local.erb

touch /var/lock/subsys/local

if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then
  echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

您自己的解决方案的问题是,该模板可能会被另一个具有自己的rc.local模板的配方覆盖

为了改变这一点,我将这些行添加到现有的rc.local

execute "disable_thp_hugepage_defrag" do
    command "sudo sed -i -e '$i \\echo never > /sys/kernel/mm/transparent_hugepage/defrag\\n' /etc/rc.local"
    not_if 'grep -c "transparent_hugepage/defrag" /etc/rc.local'
end
execute "disable_thp_hugepage_enables" do
    command "sudo sed -i -e '$i \\echo never > /sys/kernel/mm/transparent_hugepage/enabled\\n' /etc/rc.local"
    not_if 'grep -c "transparent_hugepage/enabled" /etc/rc.local'
end
grep
确保该行不在其中


也许chef有更好的方法来管理它?

我们可以通过对元素进行分组来有效地替换文件内容

e、 g。 将“transparent_hugepage=never”附加到以“kernel”开头的现有行的末尾

\0添加整个机械加工字符串


注意:''(单引号)

我通过在chef中复制以下内容禁用了hugepages(外观与上面相同,但添加了not_if语句):

例如

我还成功地在
文件中插入了行。如果不匹配,插入行可能对您有用

搜索文件替换行(正则表达式、换行符)⇒ 反对

ruby_block 'replace_line' do
  block do
    file = Chef::Util::FileEdit.new('/path/to/file')
    file.search_file_replace_line('/Line to find/', 'Line to replace with')
    file.write_file
  end
end

文件是静态的,还是有其他可能是动态的配置?如果它们的文件是静态的,那么您可以将配置文件添加到cookbook的文件中,然后使用cookbook_file指令替换以前的配置文件。你找到解决方案了吗?@spuder我从来没有想到如何用chef修改配置文件中的一行。我希望我是一名主厨,但我很确定我仍然只是在菜场工作。如果您试图禁用MongoDB的THP设置,我会发布我最后所做的作为答案。您的配方存在的问题是,如果另一个使用另一个用于rc.local的templace,那么您的修改将丢失。为什么要使用tee和append?仅仅不回显文件还不够吗?
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
execute "disable_hugepage_defrag" do
  not_if "grep -F '[never]' /sys/kernel/mm/transparent_hugepage/defrag"
  command "echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"
end
ruby_block 'replace_line' do
  block do
    file = Chef::Util::FileEdit.new('/path/to/file')
    file.search_file_replace_line('/Line to find/', 'Line to replace with')
    file.write_file
  end
end