it-swarm-pt.tech

chef instala e atualiza programas da fonte

Eu tenho um programa que eu construo a partir da fonte. Para isso, estou usando o recurso script. Qual é uma boa maneira de implementar a lógica para instalação e atualização? No momento, eu apenas tenho a instalação implementada com o built-in not_if condicional.

script "install_program" do
  not_if {File.exists?('/program')}
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program.tar.gz
    tar -zxf program.tar.gz
    cd tarball
    ./configure
    make
    make install
  EOH
end
35
m33lky

Em primeiro lugar, se você tem os meios para hospedar um repositório de pacotes interno, geralmente recomendo que você crie pacotes nativos para a (s) plataforma (s) de destino e use o recurso package para gerenciá-los, em vez de construir a partir de fonte. Eu sei que nem sempre está disponível ou viável, então ...

O método com o qual você cria um idempotente do script de instalação no estilo "./configure && make && make install" depende do tipo de software com o qual você está trabalhando. Na maioria das vezes, é suficiente verificar a existência do arquivo de destino. Às vezes, é desejável determinar qual versão é necessária e qual versão o programa produzirá quando executado com a opção de linha de comando apropriada. Usarei seu recurso acima como ponto de partida para esses exemplos. Observe que você pode usar bash como um atalho para script recursos que possuem intérprete bash.

Pressupostos: o programa está instalado em /usr/local/bin/program e aceita um argumento --version presumivelmente para exibir o número da versão. Eu coloquei o CD, configurei e faço comandos junto com && porque, presumivelmente, se alguém falhar, não devemos tentar continuar a execução.

bash "install_program" do
  not_if "/usr/local/bin/program --version | grep -q '#{node[:program][:version]}'"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
end

Em vez de usar wget, é um pouco melhor usar o remote_file recurso, pois ele é idempotente por si só. Observe que o parâmetro checksum é adicionado, com o valor como um atributo. Este parâmetro informa ao Chef para não baixar o arquivo remoto se o arquivo de destino local corresponder à soma de verificação. Esta é uma soma de verificação SHA256. Além disso, esse recurso notificará o script para ser executado imediatamente, portanto, após o download. O script é definido com a ação :nothing para que seja executado apenas se o arquivo remoto for baixado.

remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do
  source "http://www.example.com/program-#{node[:program][:version]}.tar.gz"
  checksum node[:program][:checksum]
  notifies :run, "bash[install_program]", :immediately
end

bash "install_program" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
  action :nothing
end

Além disso, /tmp pode ser apagado no seu sistema após a reinicialização. É recomendável fazer o download para outro local que não seja excluído, como o local do cache de arquivos do Chef, que é o valor de Chef::Config[:file_cache_path]. Por exemplo:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
  ...
end

Para mais exemplos, você pode ver as receitas "de origem" em vários livros de receitas compartilhados pelo Opscode aqui: http://github.com/opscode/cookbooks . php, python, gnu_parallel e nagios livros de receitas têm receitas "de origem".

68
jtimberman