Verifique a versão usando o Chef

1

Eu tenho um pequeno aplicativo instalado em alguns servidores, eu queria escrever uma receita rápida que me permita coletar o número da versão desses servidores.

Isso é o que escrevi:

bash "Get app version" do
    code <<-EOH
    cat /var/lib/myapp/node_modules/myapp/package.json | grep version
    EOH
end

No entanto, quando executo o comando bootstrap de faca, não vejo a saída no meu console, mesmo que eu execute com -VV a saída não está lá.

Eu tenho duas perguntas:

  1. Essa é a melhor maneira de coletar os números de versão?
  2. Por que os resultados de cat não aparecem no meu console?
por Or W 18.08.2013 / 10:40

2 respostas

1

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.

    
por 18.08.2013 / 18:24
0

Primeiro, para ver a saída na saída da faca, talvez seja necessário redirecionar a saída stdout para stderr , o que é um inverso do idioma usual:

cat /var/lib/myapp/node_modules/myapp/package.json | grep version 1>&2

Mas se você acabou de executar o comando original usando ssh (ou distribuído com uma ferramenta como dsh ) em vez de faca, obterá a saída desejada sem a sobrecarga ou a saída extra de uma execução de faca. p>

Quanto à "melhor maneira" de coletar os dados, isso depende totalmente do que você deseja usar. Se é apenas informativo e quer vê-lo quando você faz uma operação de bootstrap manual, então usar a faca dessa maneira pode ser bom. Mas se você quisesse fazer algo sistematicamente com os dados, como colecioná-los e usá-los em outro programa, usar faca provavelmente não seria a melhor maneira de fazê-lo.

    
por 18.08.2013 / 11:30