Salve o número da versão como um atributo do nó . Desta forma você tem um repositório central das versões e você pode usar facilmente o atributo node em outro lugar do Chef.
Algo como:
ruby_block "myapp installed version check" do
block do
# file setup
file = "/var/lib/myapp/node_modules/myapp/package.json"
raise "File doesn't exist [#{file}]" unless File.exists?( file )
# get the version line
versions = open( file ).grep(/version/)
raise "No versions in file [#{file}]" unless versions.length > 0
Chef::Log.warn "Too many versions [#{versions.length}] in file [#{file}]" unless versions.length == 1
# some regex to match your version number
version = versions[0].match(/\d+\.\d+/).to_s
# set the attribute
node.set[:installed][:myapp][:version] = version
# optionally reload node so attribute is available during this chef-client run
node.from_file( run_context.resolve_attribute('myapp-cookbook', 'default') )
# and log it.
Chef::Log.info( "myapp version is [#{node[:installed][:myapp][:version]}]" )
end
end
raise
falhará no Chef executado com uma exceção. Use Chef::Log
e return
para os erros que não são críticos e você deseja continuar processando receitas.
Você pode remover os bits de atributo do nó e registrar as informações para que apareçam no log do chef-cliente. Isto é um pouco melhor do que depender de stdout / stderr que desaparece quando o cliente-chef não está executando interativamente (ou seja, como um serviço). Mas por que apenas registrá-lo quando você pode tê-lo armazenado em um local central e consultar o valor em sua infra ??
note geralmente é melhor implementar o ruby em uma biblioteca e usá-lo por meio de recurso leve personalizado se você achar que vai usar o recurso para myapp-b.