chef : enable service based on a "grep" result

63 Views Asked by At

I had a first question, but apparently, I was doing things in the wrong way, so trying this new approach. I'm creating a systemd service file to run multiple instances of the service :

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

The number of instances (and names) is configured into a file, with one or multiple entries like :

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

Now, I need to enable as many services as OPTIONS_X exist in this file. As a "bash-man", I would grep, but I suppose there must exist a right way to do this in ruby, so that in the end, it will run :

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

Thank you.

2

There are 2 best solutions below

0
seshadri_c On BEST ANSWER

Since the basis for the list of services is from a file, bash/shell utilities would be more efficient in getting the required details, i.e. the count of OPTIONS. This also means that this file would need to be maintained/updated correctly for this logic to work.

Something like:

grep OPTIONS_ path/to/file | wc -l

This count can be stored in a variable and services can be enabled/started based on this.

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 On

Yes, you can read files line by line with ruby using IO.each_line or IO.readlines

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