Digamos que eu tenha algum código do Chef, como:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Onde /bin/somecommand
ainda não existe porque está instalado por somepackage
. Isso falhará no tempo de compilação da receita por esse motivo, mas obviamente funcionará no tempo de convergência, desde que o pacote seja instalado com êxito (e, se isso não acontecer, obviamente a receita falhou de qualquer maneira). Isso também falha se o pacote estiver instalado como uma receita anterior na lista de execução, pois todos eles são compilados antecipadamente. Como incluo itens em uma receita de Chef que essa receita ou lista de execução se instala?
myvar
não há resposta real, geralmente evito usar a avaliação de código de comandos externos em tempo de compilação, a menos que seja necessário definir outros recursos. Em resumo, eu faria umruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
node.run_state
era exatamente o que eu procurava - obrigado. Faça disso uma resposta e eu aceito!Respostas:
Eu iria
node.run_state
armazenar uma variável transitória em uma execução e defini-la de umaruby_block
maneira que isso aconteça no tempo de convergência, algo como isto:Tanto quanto eu sei, não é necessário exigir 'mixlib / shellout'.
fonte
As especificidades dependem do caso de uso exato. Se o valor for usado apenas como uma propriedade em outro recurso, você usaria o
lazy
método auxiliar. Se você não precisar da saída, usaria oexecute
recurso. Em alguns casos mais complexos, você pode usar umruby_block
recurso ou gravar seu próprio recurso personalizado.fonte