Home > Enterprise >  Chef Recipe (RUBY)
Chef Recipe (RUBY)

Time:05-29

I'm working on a chef recipe that will pull down a program installer depending on the memory total in a linux server. If the memory total is 8GB or more install .... if the memory is less than 8GB then install ... . Does anybody happen to know how to script this? Chef is ruby based. Within my chef recipes I have attempted the following, but had no success.

puts "***** Linux server node['platform_family']=#{node['platform_family']}"
puts "***** Linux server node['memory.total']=#{node['memory.total']}"
# -------------------------------------------------------------------------------
puts "*****#{node['platform_family']}"
puts "*****#{node['memory.total']}"

if node['platform_family'] == 'debian' && node['memory.total'] >= 7000000
   remote_file '/tmp'
        source 'local file'
        action :create
   end
elsif
  remote_file '/tmp'
       source 'external file'
       action :create
  end

CodePudding user response:

If you're only ever going to use this recipe in Linux, then this method will work:

memory_in_megabytes = node.memory.total[/\d*/].to_i / 1024

if memory_in_megabytes > 512
  ## Do your thing!
end

Different OSes report this value differently and not always in the same format though. So if you want to support any system platform (just in case this has a use for someone not using Linux) this would be a far better option:

memory_in_megabytes = case node['os']
when /.*bsd/
  node.memory.total.to_i / 1024 / 1024
when 'linux'
  node.memory.total[/\d*/].to_i / 1024
when 'darwin'
  node.memory.total[/\d*/].to_i
when 'windows', 'solaris', 'hpux', 'aix'
  node.memory.total[/\d*/].to_i / 1024
end

if memory_in_megabytes > 512
  ## Do your thing!
end

CodePudding user response:

The remote_file resource can written in a better way (once) if we can compute the value of source property beforehand. Also since you have shown comparison of node['platform_family'], it appears you would need to match for OS families other than debian as well.

Below code will match for platform_family and ['memory']['total'] and set a value that we can use with the source property.

mem = node['memory']['total'][/\d*/].to_i

remote_src = case node['platform_family']
when 'debian'
  mem >= 7000000 ? 'local file' : 'remote file'
when 'redhat'
  mem >= 7000000 ? 'some file' : 'some other file'
# when some other OS family if required
end

remote_file '/tmp/somefile' do
  source remote_src
  action :create
end

Note that I'm using ternary operator as an alternative to if / else within when condition of case statement.

  • Related