chef :根据“grep”结果启用服务

chef : enable service based on a "grep" result

提问人:Burps 提问时间:10/2/2023 更新时间:10/18/2023 访问量:49

问:

我有第一个问题,但显然,我做事的方式不对,所以尝试这种新方法。我正在创建一个systemd服务文件来运行该服务的多个实例:

if ( (node[:platform] == "redhat" &&  node[:platform_version] >= "7"))
  cookbook_file "/usr/lib/systemd/system/[email protected]" do 
    source "usr/lib/systemd/system/[email protected]"
    owner "root"; group "root"; mode "0644"
  end
end

实例数(和名称)配置到一个文件中,其中包含一个或多个条目,例如:

OPTIONS_0="--conf=/etc/sec/oracle.sec --input=/var/log/oracle.log "
OPTIONS_1="--conf=/etc/sec/jboss.sec --input=/var/log/jboss.log "

现在,我需要启用此文件中OPTIONS_X尽可能多的服务。 作为一个“bash-man”,我会 grep,但我想在 ruby 中一定有一种正确的方法可以做到这一点,这样最终,它就会运行:

service "sec@0" do action [:enable, :start]  end
service "sec@1" do action [:enable, :start]  end
[...]
service "sec@X" do action [:enable, :start]  end

谢谢。

Ruby Chef-Infra 食谱

评论


答:

1赞 seshadri_c 10/3/2023 #1

由于服务列表的基础来自文件,因此 bash/shell 实用程序在获取所需详细信息(即 OPTIONS 的计数)方面会更有效。这也意味着需要正确维护/更新此文件才能使此逻辑正常工作。

像这样:

grep OPTIONS_ path/to/file | wc -l

此计数可以存储在变量中,并且可以基于此启用/启动服务。

count = `grep OPTIONS_ path/to/file | wc -l`

count.to_i.times do |num|
  service "sec@#{num}" do
    action [:enable, :start]
  end
end
0赞 Draco Ater 10/18/2023 #2

是的,您可以使用 IO.each_lineIO.readlines 使用 ruby 逐行读取文件

File.readlines('/path/to/file').count.times do |i|
  service "sec@#{i}" do
    action [:enable, :start]
  end
end