Como chef coisas que ainda não existem


9

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/somecommandainda 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?


Esse tipo de coisa não é um problema no CFEngine
Gaius

11
Sem entender o uso de myvarnã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.[...] }
Tensibai

@Tensibai node.run_stateera exatamente o que eu procurava - obrigado. Faça disso uma resposta e eu aceito!
Gaius

Isso terá que esperar até amanhã :) muito difícil escrever uma resposta correta no telefone
Tensibai

Respostas:


4

Eu iria node.run_statearmazenar uma variável transitória em uma execução e defini-la de uma ruby_blockmaneira que isso aconteça no tempo de convergência, algo como isto:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

Tanto quanto eu sei, não é necessário exigir 'mixlib / shellout'.


2

As especificidades dependem do caso de uso exato. Se o valor for usado apenas como uma propriedade em outro recurso, você usaria o lazymétodo auxiliar. Se você não precisar da saída, usaria o executerecurso. Em alguns casos mais complexos, você pode usar um ruby_blockrecurso ou gravar seu próprio recurso personalizado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.